Symfony 8.2 Nouveauté Publié le

Valider une expression cron pour de vrai

La contrainte Cron analyse l'expression au lieu d'en vérifier la forme : 60 * * * * est refusé, et trois modes disent si les alias et les « # » du Scheduler sont admis.

Notions abordées : Validator

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.

D'où vient la fonctionnalité : la pull request d'origine.