Aller au contenu

Publication

phil/doctrine-behaviours
TypeGenreRôle
Contract\PublishableinterfaceL'état dans les accesseurs propres au workflow, isPublished(), les dates
PublishableEntitytraitLes colonnes publication_state, 32 caractères, published_at et unpublished_at
PublicationWorkflowconstantes, definition(), markingStore()La machine à états, sous le nom phil_publication
PublicationListenerécouteur : workflow.<name>.enteredHorodate les dates, en UTC

L'état est tenu par symfony/workflow, une dépendance facultative : une garde ou un écouteur de l'application peut retenir ou suivre une publication comme toute autre transition.

TransitionDeVers
publishdraft, unpublishedpublished
unpublishpublishedunpublished
En entrant danspublished_atunpublished_at
publishedmis à maintenant, sauf si l'enregistrement en a déjà uneoublié
unpublishedgardémis à maintenant

La date de la première publication reste quand un enregistrement est retiré puis publié de nouveau. Un enregistrement qui a reçu une date à l'avance, par une importation ou par un éditeur qui choisit la date affichée, la garde. Le vidage reste l'affaire de l'application, comme pour tout workflow.

Hors de Symfony :

$dispatcher->addListener('workflow.'.PublicationWorkflow::NAME.'.entered', new PublicationListener($clock));
$workflow = new StateMachine(PublicationWorkflow::definition(), PublicationWorkflow::markingStore(), $dispatcher, PublicationWorkflow::NAME);

$workflow->apply($article, PublicationWorkflow::PUBLISH);
$manager->flush();

Publier à une heure fixée

Une date future est un travail pour un planificateur, pas une colonne : l'état change quand l'heure vient, par le workflow, avec ses gardes. phil/scheduled-transitions-bundle le fait pour tout objet que connaît workflow.registry, et atteint ce comportement par les seuls noms des transitions : aucun des deux paquets ne dépend de l'autre. L'application écrit le SubjectResolver qui trouve ses enregistrements :

$scheduler->schedule(ResourceReference::of('article', $article->id), 'publish', new DateTimeImmutable('2026-11-09 09:00'));

Un workflow à plus de places, comme une relecture avant la publication, garde ces trois noms pour que l'écouteur horodate les dates ; le bundle laisse alors sa déclaration à l'application.