Changelog
phil/directory-bundleAll notable changes to phil/directory-bundle will be documented in this file.
Updates should follow the Keep a CHANGELOG principles.
0.1.0-alpha - 2026-11-12
Added
- The option
allow_localhost,falseby default:true, in development and tests, lets the pages of the sitemap be onlocalhostor under.localhost;DirectoryUrlProvidertakes it as its last argument. Listing(tablephil_directory_listing): a genre, an author and up to 50 editors;ListingDimension(tablephil_directory_listing_dimension) with the content capabilities workflow, SEO, excerpt, routable and body.- The capabilities contact, address, location and edited-by, with their mappings, data mappers, mergers and normalizers.
Directory:create(),edit(),publish(),addEditor(),removeEditor(),changeIndexing(),draft(),published()(with an offset, a limit and the reader of phil/indexing-consent),find(),history(), which reads a locale's versions in one query; a change by an author or an editor waits for an administrator unlesspublish_every_changeis on.- Relations between genres, the key
relations:Relation,RelationsandRelatedListings; the capability related (RelatedCapable,RelatedTrait,RelatedPipeline, the JSON columnrelated);Directory::related()andrelationsFrom(), the related listings checked oncreate()andedit(); a choice per relation inListingType, the optionrelations; the related listings on the page of a listing. The related listings a listing names are read by their identifiers, and so are those that name it, looked up first among the live rows of their genre through the portRelatedLookupand its Doctrine adapterDoctrineRelatedLookup. - The list of a genre, the related listings and the sitemap read the published listings in a few queries, filtered
on the genre column, through content-bundle's
PublishedRowQuery. A listing published without a slug has no page, and is left out of them. - Who finds a listing, as its author decides with phil/indexing-consent:
ListingimplementsHasIndexingConsent, its choice kept in the columnsindexingandsite_listedand changed at once by its author or an administrator, from the page of its editors; the list of a genre and the related listings leave out an unlisted listing, the sitemap any listing that is not listed, in the same query; the page of a listing that is not listed sendsnoindex, noarchiveinX-Robots-Tagand<meta name="robots">, and carries the choice underIndexingPolicy::REQUEST_ATTRIBUTEfor the structured data of the page. Directory::eraseUser(), through the portUserErasureand its Doctrine adapterDoctrineUserErasure: an erased account's identifier leaves the listings it wrote or edits (Listing::forget()) and theeditedByof every version it wrote; the documentation says which identifiers are kept, for how long, and who sees them.PhilDirectoryBundle, extension aliasphil_directory(genres,admin_role,publish_every_change,sitemap_locale,words,page_size,relations); it prepends the Doctrine mapping, the identifier type and the content root.ListingVoter:phil_directory.edit,phil_directory.editors,phil_directory.publish.ListingType,EditorsType,DirectoryControllerand the route loaderphil_directory: the list, a listing, its form, its editors, its history and its publication, for each genre. The list of a genre shows a page ofpage_sizelistings (50 by default, 1 to 500),?page=2, with links to the previous and the next page.DirectoryUrlProvider: one sitemap section per genre, read in chunks of 500; a genre whose key ends in an underscore and digits, asseason_2, is the sectionseason-2(Sitemap::sectionNamed()).- The templates under
@PhilDirectory, the translationsphil_directoryin French and English. - The documentation in
doc/, one file per topic, indexed by the README. CONTRIBUTING.md,SECURITY.mdandCODE_OF_CONDUCT.md.