Aller au contenu

Référence

phil/migration

Annoncer depuis une migration

TypeNatureRôle
AnnouncingMigrationclasse abstraiteUn AbstractMigration de Doctrine avec note() et news()
AnnouncinginterfaceannounceWith(Announcements) : ce qu'appelle la fabrique
AnnouncestraitannounceWith(), note() et news(), pour une classe de base propre à une application
Newsfinal readonly classUn titre, ses lignes et, éventuellement, une URL
AnnouncementsMissingLogicExceptionUne migration a annoncé sans avoir reçu les annonces

note() prend une ligne par locale (['fr' => '* Nouveau calendrier.', 'en' => '* A new calendar.']) et news() un News par locale. Une locale est une langue, éventuellement suivie d'une région : fr ou fr_CA. Une note est une ligne de texte ; une nouvelle a un titre, et son URL est une URL ou rien. Tout le reste est un InvalidAnnouncement.

Une application qui a sa propre migration de base utilise le trait :

abstract class SiteMigration extends AbstractMigration implements Announcing
{
    use Announces;
}

Ce qu'annonce une exécution

TypeNatureRôle
Announcementsfinal classLes notes et les nouvelles d'une exécution, conservées par la migration qui les a laissées
Releasefinal readonly classCe qu'annonce l'exécution, dans l'ordre d'exécution des migrations ; notesIn() et newsIn() par locale
AnnouncingMigrationFactorydécore MigrationFactoryDonne les annonces à chaque migration Announcing
AnnouncingMigratordécore MigratorAnnonce l'exécution une fois qu'elle est terminée

Le migrateur vide les annonces au début d'une exécution, puis, une fois celle-ci terminée, garde les notes et les nouvelles des migrations qui sont allées jusqu'au bout, ni sautées ni en échec, dans l'ordre du plan :

L'exécutionCe qui est annoncé
terminéechaque migration allée jusqu'au bout
--dry-runrien
échouée, en tout ou rienrien : tout a été annulé
échouée, pas en tout ou rienles migrations exécutées avant l'échec, qui restent

L'annonce vient après que Doctrine a validé, de sorte qu'une migration annoncée est une migration conservée.

Canaux

TypeNatureRôle
Channelfinal readonly classOù et comment une version est annoncée
ContentenumNotes ou News
Announcerfinal readonly classAnnonce une version sur chaque canal
PublisherinterfaceEnvoie un message sur un transport
ChatterPublisherfinal readonly classPublie par le chatter de symfony/notifier
Argument de ChannelValeur par défautRôle
transportLe transport de chatter, tel que le nomme symfony/notifier
localeLa locale dans laquelle l'annonce est lue ; une note ou une nouvelle qui n'y est pas écrite est omise
contentContent::NotesLes notes de version, ou les nouvelles
title''Le titre du premier message ; aucun s'il est vide
continued''Le titre des messages qui suivent ; aucun s'il est vide
heading'{title}'La ligne d'une nouvelle qui contient son titre
link'{url}'La ligne qui contient son URL ; aucune si elle est vide ou si la nouvelle n'a pas d'URL
maxLength2000Le message le plus long, en caractères : 2000 sur Discord ; au moins 100

Un titre occupe au plus la moitié d'un message. {counter} dans title ou continued devient (2/3) quand la version prend plus d'un message, et rien quand elle en prend un seul.

Un canal qui échoue est journalisé comme une erreur et abandonné ; les autres canaux sont quand même informés, et les migrations, déjà exécutées, restent.

Comment les messages sont coupés

Les lignes d'un canal sont réunies, une par ligne, tant que le message, titre et ligne vide compris, tient dans maxLength ; la ligne suivante commence le message suivant. Une ligne trop longue à elle seule est coupée à sa dernière espace qui tient, ou au milieu d'un mot quand il n'y en a aucune. La place qu'occupe un titre est comptée avec son compteur, de sorte qu'une version de dix messages fait de la place pour (10/10). Les longueurs se comptent en caractères, jamais en octets.