phil / publishing
The PagePublished and PageRetired events and their contract: a page's canonical address, language, indexable flag and owner identifier, for the listeners that follow what goes online and offline
Requires
- php: >=8.5
- ext-mbstring: *
- phil/url: ^0.1@dev
Requires (Dev)
- phpunit/phpunit: ^13.4
- roave/security-advisories: dev-latest
Suggests
None
Provides
None
Conflicts
None
Replaces
None
This package is auto-updated.
Last update: 2026-11-12 23:51:55 UTC
README
The events of a page that goes online or offline: its canonical address, its language, whether it may be indexed, and how its owner names it.
phil/publishing holds two events and their contract. PagePublished says a page went online, or went online again
with new content; PageRetired says it went offline, taken offline or deleted. Each carries the page's canonical
address — a Phil\Url\Url, absolute and normalised —, its language as a BCP 47 tag, an « indexable » flag, and the
identifier the package that owns the page gives it. Both implement Contract\PageEvent, which a listener reads
without caring which of the two it got. It does not dispatch anything, store pages, build addresses or decide
what is indexable: the package that owns a page does, once the change is stored.
It is for applications where several packages follow what readers can see: a sitemap that adds and removes its entries, an HTTP cache that purges a page, a search engine ping, a feed hub, a federation outbox. The owner of the pages dispatches the events on whatever dispatcher the application has; each follower listens to them, and none of them knows the others. Other events of a page's lifecycle may join these two later.
phil/publishing is a plain PHP library on phil/url, with no dependency on a framework. Its events are plain
immutable objects, dispatched through a PSR-14 dispatcher such as Symfony's EventDispatcher.
Status
| Part | State |
|---|---|
PagePublished and PageRetired, with their checks |
Implemented and tested |
Contract\PageEvent |
Implemented and tested |
Documentation
| Document | What it covers |
|---|---|
| Installation | Requirements and installing. |
| The events | The four fields, their checks, when an owner dispatches each event, and how a listener reads them. |
| Extension points | What an owner and a listener rely on, and when it is stable. |
| Testing | The package's tests. |
| Reference | Every public type, with its role. |
Quick start
composer require phil/publishing
The owner of a page dispatches, once the page is stored:
use Phil\Publishing\PagePublished; use Phil\Url\Url; $dispatcher->dispatch(new PagePublished( Url::fromString('https://example.org/fr/news/opening'), 'fr', indexable: true, ownerId: 'news:42', ));
A follower listens, here with Symfony's EventDispatcher:
use Phil\Publishing\PageRetired; use Symfony\Component\EventDispatcher\Attribute\AsEventListener; #[AsEventListener] final readonly class PurgeRetiredPage { public function __invoke(PageRetired $event): void { $this->cache->purge($event->canonicalUrl->toString()); } }
Requirements
PHP 8.5 or later, and phil/url.
Contributing
Contributions are welcome on the PHIL monorepo: read the contribution guide and the code of conduct. Report a vulnerability privately, as the security policy explains, never in a public issue.
License
MIT, © Philippe Gamache, doing business as Le Gnome Archiviste; a Parler Haut Interagir Librement project. See LICENSE.