Cette page suppose la connaissance des bases du développement de packages. Il est recommandé de comprendre le fonctionnement de base des service providers avant de la lire.
Pourquoi les providers différés sont nécessaires
Les service providers ordinaires voient leursregister() et boot() appelés à chaque requête. Initialiser à chaque fois des fonctionnalités que toutes les pages n’utilisent pas — envoi d’e-mails, queues, cache — est un gaspillage.
L’interface DeferrableProvider
Illuminate\Contracts\Support\DeferrableProvider est une interface simple avec une seule méthode provides().
Implémentation de base
L’implémentation d’un provider différé se fait en trois étapes.1
Implémenter DeferrableProvider
2
Lier les services dans register()
Écrivez les bindings dans
register() comme dans un provider ordinaire.3
Retourner les services enregistrés dans provides()
provides() doit retourner tous les services liés dans register(). Laravel se base sur cette liste pour déterminer « quel provider charger lorsque tel service est demandé ».Mécanisme du manifeste des services
Au démarrage, Laravel génère un fichier manifestebootstrap/cache/services.php. Ce fichier contient la liste des services fournis par les providers différés.
Flux du fonctionnement interne
Importance de la méthode provides()
Siprovides() contient un oubli, le service correspondant ne sera jamais résolu.
$bindings / $singletons : incluez-les dans provides().
Contraintes des providers différés
Les providers différés conviennent aux providers dont le seul objectif est l’enregistrement de bindings dans le conteneur. Les providers qui effectuent les opérations ci-dessous dansboot() ne peuvent pas être différés.
La méthode when() — enregistrement déclenché par un événement
La méthodewhen() permet d’enregistrer un provider lorsqu’un événement particulier est émis. Utile pour des providers nécessaires uniquement dans certains contextes (traitement de jobs, etc.).
when() est émis, le provider est chargé même si aucun service n’a été directement résolu.
Utilisation dans le développement de packages
Pour un package tiers, les providers différés contribuent également aux performances de l’application utilisatrice.Pattern recommandé
mergeConfigFrom() vérifie en interne si la configuration est en cache, donc l’appeler dans le register() d’un provider différé est sûr. Si la configuration est déjà en cache, cela ne fait rien.Séparer l’enregistrement des commandes Artisan avec runningInConsole()
L’enregistrement de commandes n’est nécessaire qu’au démarrage d’Artisan ; branchez donc avec runningInConsole(). Toutefois, si vous différez un provider qui fournit des commandes, incluez la classe de commande dans provides() ou séparez les commandes dans un provider dédié.
Exemples d’utilisation dans le cœur de Laravel
Beaucoup des providers du cœur de Laravel sont des providers différés. C’est une conception qui évite de charger immédiatement tous les services non utilisés à chaque requête.
Dans une application composée uniquement d’endpoints API,
MailServiceProvider ou BroadcastServiceProvider peuvent ne jamais être chargés durant une requête.
Critères pour décider de différer ou non
Services adaptés au différé
Services adaptés au différé
- Services qui ne sont pas utilisés à chaque requête (mail, rapports, clients d’API externes, etc.)
- Services dont l’initialisation nécessite une connexion externe ou la lecture de fichiers
- Services avec un graphe d’objets lourd
- Providers fournissant des commandes utilisées uniquement en CLI
Services non adaptés au différé
Services non adaptés au différé
- Providers qui enregistrent des routes (
loadRoutesFrom, etc.) - Providers qui enregistrent des middlewares ou gestionnaires d’exceptions actifs en permanence
- Providers qui enregistrent des global scopes ou observers Eloquent
- Services légers utilisés dans la majorité des requêtes (le surcoût du différé peut être supérieur)
Pages associées
Bases du développement de packages
Découvrez le développement de packages Laravel, avec les service providers comme noyau.
Gestion de la compatibilité des versions de packages
Stratégies de maintenance de packages pour suivre les montées de version majeures de Laravel et PHP.