Nouveau dans Symfony 8.2 (en développement). Pour valider une expression cron saisie par un utilisateur, on écrivait une expression régulière. Elle vérifie la forme, pas le sens : 60 * * * * (minute 60) ou */0 * * * * (tous les zéro minutes) passent, et le planificateur échoue plus tard, en pleine nuit.
La contrainte Cron
#[Assert\Cron] analyse l'expression avec le même paquet que le composant Scheduler, dragonmantank/cron-expression :
use Symfony\Component\Validator\Constraints as Assert; class Rapport { // les cinq champs (« 0 6 * * 1-5 ») et les alias (« @daily ») #[Assert\Cron] public string $planning; // les cinq champs seulement #[Assert\Cron(mode: Assert\Cron::MODE_STANDARD)] public string $planningStrict; // en plus, les expressions hachées du Scheduler (« # # * * * », « #daily ») #[Assert\Cron(mode: Assert\Cron::MODE_HASHED)] public string $tache; }
Une expression hachée laisse le Scheduler remplacer chaque # par une valeur tirée du nom de la tâche : les tâches récurrentes se répartissent dans le temps au lieu de toutes partir à minuit.
Symfony 8.2 ajoute deux autres contraintes : EntityExists, qui vérifie qu'une entité Doctrine existe pour un identifiant reçu, et Audio, qui vérifie la durée, le débit ou le codec d'un fichier son.
À faire
PUT /rapports/planning enregistre les trois plannings d'un rapport : l'envoi, lancé par notre planificateur, l'export recopié chez un partenaire dont l'outil ne connaît que les cinq champs, et le nettoyage confié au Scheduler. Les expressions régulières laissent passer des plannings impossibles : la requête de l'onglet « Requêtes » en montre un.
Remplacez-les par la contrainte Cron, avec le bon mode pour chaque champ.