Featured image of post Quelles sont les différences logiques entre bind(), singleton(), scoped() et instance() dans Laravel ? Dans quels scénarios peuvent-ils être utilisés ?

Quelles sont les différences logiques entre bind(), singleton(), scoped() et instance() dans Laravel ? Dans quels scénarios peuvent-ils être utilisés ?

Quelles sont les différences logiques entre bind(), singleton(), scoped() et instance() dans Laravel ? Dans quels scénarios peuvent-ils être utilisés ?

Comparaison des méthodes de liaison d’objets dans le conteneur de services Laravel

Méthode bind() singleton() scoped() instance()
Description Crée une nouvelle instance chaque fois qu’elle est résolue. Crée une seule instance et renvoie la même instance lors des requêtes ultérieures. Crée une seule instance dans chaque cycle de vie de requête/tâche ; elle est effacée après la fin de la requête. Lie une instance existante au conteneur et renvoie cette instance chaque fois qu’elle est résolue.
Avantages - Une instance fraîche pour chaque requête, pas de problèmes de partage d’état
- Utilisation propre de la mémoire
- Convient à la logique nécessitant un état indépendant
- Peut fournir une configuration unique pour chaque requête
- Économise les ressources système en créant une instance une seule fois
- Assure la cohérence de l’état
- Convient au partage de configuration et de ressources
- Meilleures performances en cas de forte concurrence
- Équilibre l’utilisation de la mémoire et le partage d’état
- Partage l’état au sein d’une requête mais isolé entre les requêtes
- Convient aux scénarios de requête Web
- Contrôle total sur le moment de création de la instance
- Peut préconfigurer l’état de l’instance
- Convient aux services nécessitant une configuration spécifique
Inconvénients - Nécessite plus de ressources système pour créer des instances de manière répétée
- Peut affecter les performances en cas de forte concurrence
- Ne convient pas aux scénarios nécessitant un état partagé
- Peut causer des problèmes de performance car une nouvelle instance est créée à chaque fois.
- L’état partagé peut entraîner des bugs difficiles à tracer
- Ne convient pas aux scénarios nécessitant un état indépendant
- L’utilisation de la mémoire persiste jusqu’à la fin du programme
- Les tests nécessitent une attention particulière à la réinitialisation de l’état
- Si l’instance conserve un état, cela peut entraîner un comportement inattendu.
- Peut causer des problèmes dans les tâches de longue durée
- Nécessite de comprendre le cycle de vie de la requête
- Ne convient pas aux commandes CLI
- Moins flexible
- Impossible d’ajuster dynamiquement la configuration de l’instance
- Peut occuper de la mémoire au démarrage
- Ne convient pas aux cas nécessitant un chargement différé ou plusieurs instances.
Cas d’utilisation Pour les services à courte durée de vie ou les classes nécessitant un état indépendant. Pour les services partagés globalement, comme les loggers ou les gestionnaires de configuration. Pour les services qui doivent maintenir un état au sein d’une requête mais pas entre les requêtes, comme les connexions à la base de données. Lorsque vous avez déjà une instance et que vous souhaitez la réutiliser, comme un objet de configuration partagé.
Exemple Lorsque vous avez une classe Product et que vous souhaitez créer une nouvelle instance de Product chaque fois que des données de produit différentes sont demandées. Lorsque vous avez une classe Logger et que vous souhaitez que toutes les opérations d’écriture de journal utilisent la même instance pour maintenir la cohérence. Lorsque vous avez une classe ShoppingCart et que vous devez partager l’état du panier d’achat au sein de la même requête. Lorsque vous avez une classe DatabaseConfig et que vous devez définir les paramètres de connexion au démarrage de l’application.

Exemples

Utilisation de bind()

$this->app->bind('Product', function () {
 return new Product();
});

Chaque fois que app('Product') est appelé, il renvoie une nouvelle instance de Product.

Utilisation de singleton()

$this->app->singleton('Logger', function () {
 return new Logger();
});

Chaque fois que app('Logger') est appelé, il renvoie la même instance de Logger.

Utilisation de scoped()

$this->app->scoped(Transistor::class, function (Application $app) {
    return new Transistor($app->make(PodcastParser::class));
});

Partage la même instance au sein du même cycle de vie de requête ; différentes requêtes créeront de nouvelles instances.

Utilisation de instance()


$service = new Transistor(new PodcastParser);
 
$this->app->instance(Transistor::class, $service);

Lie directement une instance existante au conteneur.

Résumé

Laravel peut actuellement être appliqué dans de nombreux types de scénarios différents, tels que les requêtes Web, les commandes CLI, les tâches de file d’attente, les commandes de console, etc.

Par conséquent, lors du choix de la méthode de liaison à utiliser, vous devez tenir compte des besoins du service dans différents scénarios et si vous avez besoin de partager l’état ou la configuration.

Reference

All rights reserved,未經允許不得隨意轉載
Généré avec Hugo
Thème Stack conçu par Jimmy