ServiceProvider::optimizes(), vous pouvez intégrer les commandes de génération et de suppression aux commandes optimize et optimize:clear de Laravel.
Cette page part des bases du développement de packages et examine l’implémentation de Laravel Framework v13.35.0. Elle ne traite pas du format des fichiers de cache, mais du contrat d’enregistrement et d’exploitation.
Distinguer l’enregistrement des commandes de celui des tâches
commands() enregistre les classes de commande que l’on peut appeler depuis Artisan. optimizes() est un traitement distinct qui enregistre, en tant que tâches d’optimisation, des noms de commandes déjà exécutables. Appeler uniquement la seconde méthode n’enregistre pas les classes de commande.
L’exemple suivant suppose que votre package implémente déjà CacheMetadataCommand et ClearMetadataCommand, dont les $signature respectives sont courier:cache et courier:clear-cache.
optimizes() sont nullables : vous pouvez donc enregistrer uniquement la génération ou uniquement la suppression. Indiquez toutefois toujours aux utilisateurs par quelle procédure le cache généré est invalidé.
La clé d’enregistrement fait aussi partie du contrat public
ServiceProvider stocke les commandes de génération dans le tableau statique $optimizeCommands et les commandes de suppression dans $optimizeClearCommands. Dans les deux cas, key sert de clé de tableau.
Si vous omettez key, un nom est dérivé du nom de classe du provider. Par exemple, CourierServiceProvider donne courier. Comme seul le nom de classe est utilisé, deux providers homonymes situés dans des namespaces différents peuvent entrer en collision.
Si vous enregistrez à nouveau la même clé, la commande correspondante est écrasée par la dernière valeur. Pour enregistrer plusieurs tâches, spécifiez des clés distinctes. Évitez également les clés des tâches standard de Laravel comme config ou routes : lorsque les tâches standard et celles des packages sont regroupées, une clé de chaîne identique est elle aussi écrasée.
Exécution après les tâches standard
Dans l’implémentation examinée, les deux commandes déploient le tableau d’enregistrement des packages à la suite du tableau des tâches standard, puis les appellent dans l’ordre. Si vous utilisez une clé sans collision, les tâches de votre package sont ajoutées après les tâches standard.
Compte tenu de cet ordre, votre commande de génération ne doit pas reconstruire les autres caches standard, mais uniquement les données dont votre package est propriétaire. N’utilisez pas
optimizes() comme API pour contrôler l’ordre des dépendances entre plusieurs packages : si un ordre strict est nécessaire, enchaînez explicitement les commandes dédiées.
Exclure par clé ou par nom de commande
L’option--except des deux commandes accepte des valeurs séparées par des virgules. Les espaces autour de chaque valeur sont supprimés, et les tâches dont la clé ou le nom de commande correspond sont exclues.
cache:clear. cache est une clé de tâche, pas un nom propre à votre package.
L’exclusion ne s’applique qu’à l’exécution en cours. Il ne s’agit pas d’un réglage qui désactive l’enregistrement du provider ou supprime automatiquement un cache de package créé auparavant.
Distinguer le FAIL d’une tâche du code de sortie de la commande parente
OptimizeCommand et OptimizeClearCommand appellent chaque tâche avec callSilently() et transmettent à l’affichage de la tâche le fait que le code de sortie vaut 0 ou non. La sortie normale des commandes enfants n’étant pas affichée, exécutez directement la commande dédiée pour enquêter sur la cause d’un problème.
Dans Laravel v13.35.0, les deux méthodes handle() ne renvoient pas comme valeur de retour du parent le code non nul d’une commande enfant. Même si FAIL s’affiche à l’écran, la boucle continue et, en l’absence d’exception, le code de sortie de la commande parente est 0. En revanche, une exception levée est relancée par le composant d’affichage des tâches : le comportement n’est donc pas le même.
Si la génération de votre package est une condition indispensable du déploiement, adoptez une procédure qui permet de vérifier directement le code de sortie de la commande enfant. Par exemple, la commande suivante exclut la tâche du package de l’exécution groupée et l’exécute directement une seule fois après les tâches standard.
courier:cache dans le code de sortie, mais n’agrège pas les codes non nuls des tâches standard. Pour un déploiement qui doit aussi détecter strictement les échecs des tâches standard, exécutez individuellement les commandes nécessaires et vérifiez leurs codes de sortie.
Concevoir et vérifier un cache robuste aux mises à jour
Au-delà de l’enregistrement, définissez aussi les responsabilités des commandes et du code qui lit le cache.- La génération, même répétée, aboutit au même état à partir des mêmes entrées, et un échec en cours de route ne doit pas activer des données incomplètes.
- La suppression se termine normalement même si le cache n’existe pas, et ne supprime ni la configuration publiée par l’utilisateur ni les données persistantes.
- Une commande dont la génération échoue signale l’erreur et renvoie un code non nul. Le code de lecture ne doit pas non plus considérer inconditionnellement un cache corrompu comme valide.
- Si vous modifiez le format du cache, informez les utilisateurs de la nécessité de le régénérer et envisagez aussi de redémarrer les processus de longue durée.
Pages associées
Fusion et cache de la configuration des packages
Le complément de la configuration publiée et son lien avec la reconstruction du cache de configuration.
Tester des packages Laravel avec Orchestra Testbench
Enregistrer des providers et des commandes Artisan dans l’environnement de test.
Sources primaires consultées
- Documentation officielle de Laravel : Optimize commands
- ServiceProvider : optimizes() et clés d’enregistrement
- OptimizeCommand : tâches et exclusions
- OptimizeClearCommand : tâches de suppression et ordre d’exécution
- Command : valeur de retour de handle() et code de sortie
- Task : affichage du résultat et relance des exceptions