Maison >cadre php >Laravel >Comment écrire une injection de dépendances Laravel

Comment écrire une injection de dépendances Laravel

王林
王林original
2023-05-20 18:38:38558parcourir

En tant que framework PHP populaire, l'une des fonctionnalités principales de Laravel est le mécanisme d'injection de dépendances (Dependency Injection, ci-après dénommé DI). L'utilisation de l'injection de dépendances peut découpler les dépendances d'un objet de l'objet lui-même, améliorant ainsi la lisibilité, la testabilité et la maintenabilité du code. Cet article présentera comment l'injection de dépendances Laravel est implémentée et comment l'utiliser.

  1. Concept de base

L'injection de dépendances est un modèle de conception. Son idée principale est de réduire le couplage, d'améliorer la testabilité et la maintenabilité en découplant les dépendances requises par l'objet des objectifs sexuels lui-même. Dans le framework Laravel, l'implémentation du mécanisme DI repose sur le Dependency Injection Container (ci-après dénommé le conteneur DI), qui comprend principalement les points suivants :

  • Injection automatique des attributs des objets : Le conteneur DI effectuera le injection des attributs de l'objet à injecter. Injection automatique.
  • Liaison automatique et résolution des dépendances : le conteneur DI liera et résoudra automatiquement les dépendances entre les classes.
  • Prise en charge du mode singleton : les conteneurs DI peuvent prendre en charge l'utilisation du mode singleton.

Après avoir compris le concept de base du conteneur DI, nous pouvons commencer à explorer son implémentation spécifique dans le framework Laravel.

  1. Implémentation du conteneur DI

Dans le framework Laravel, l'implémentation du conteneur DI est basée sur le conteneur de service (Service Container), qui est la classe App. La classe App est la classe principale de l'ensemble de l'application. Elle est responsable de la gestion, de l'enregistrement et de la résolution de tous les services et dépendances qui doivent être utilisés. C'est donc également la classe principale du conteneur DI dans Laravel. Jetons un coup d'œil à l'implémentation spécifique du conteneur de services.

2.1 Enregistrement et analyse du service

L'enregistrement du service dans Laravel comprend principalement deux étapes : l'enregistrement d'un fournisseur de services et l'enregistrement d'un service. L'enregistrement d'un fournisseur de services vise à faciliter la gestion et l'enregistrement unifiés des services au lieu d'enregistrer manuellement les services à chaque fois. Le service d'enregistrement consiste à injecter des objets dans le conteneur DI pour une analyse ultérieure.

Le fournisseur de services enregistré peut être configuré dans le fichier de configuration config/app.php. Ajoutez simplement le fournisseur de services dans le tableau des fournisseurs. Par exemple :

'providers' => [
    // Laravel Framework Service Providers...
    IlluminateAuthAuthServiceProvider::class,
    IlluminateBroadcastingBroadcastServiceProvider::class,
    IlluminateBusBusServiceProvider::class,
    IlluminateCacheCacheServiceProvider::class,

    // Application Service Providers...
    AppProvidersAppServiceProvider::class,
    AppProvidersAuthServiceProvider::class,
    AppProvidersEventServiceProvider::class,
    AppProvidersRouteServiceProvider::class,
],

Le service d'enregistrement peut être enregistré via la méthode bind de la classe App. Par exemple :

// 将Foo类注册到DI容器中
app()->bind('foo', function() {
    return new Foo();
});

Dans l'exemple de code ci-dessus, nous enregistrons la classe Foo dans le conteneur DI via la méthode bind et spécifions son alias correspondant comme foo. Notez que dans Laravel, vous pouvez spécifier un alias pour le service afin de faciliter son analyse et son appel.

Le service d'analyse peut être analysé via la méthode make de la classe App. Par exemple :

// 通过别名解析Foo类实例
$foo = app('foo');

2.2 Résolution automatique des services

Dans Laravel, le conteneur DI résoudra automatiquement les dépendances entre les classes, nous n'avons donc pas besoin de transmettre manuellement les dépendances, et le conteneur DI peut automatiquement nous aider à résoudre l'injection de dépendances problème. Par exemple, nous avons les deux classes suivantes :

class Foo {
    public function __construct(Bar $bar) {}
}

class Bar {
    public function __construct(Baz $baz) {}
}

Ici, la classe Foo dépend de la classe Bar, et la classe Bar dépend de la classe Baz. Si nous voulons créer une instance de la classe Foo, alors il suffit de la résoudre via le conteneur DI :

// 自动解析依赖关系,并通过DI容器创建Foo类实例
$foo = app(Foo::class);

Ici, le conteneur DI créera automatiquement des instances des classes Bar et Baz et les injectera dans le constructeur du Foo classe.

2.3 Mode de service Singleton

Dans Laravel, nous pouvons enregistrer un service en mode singleton via la méthode singleton, ce qui signifie que la même instance sera renvoyée à chaque fois que le service est appelé. Par exemple :

// 将Foo类注册为单例模式
app()->singleton('foo', function() {
    return new Foo();
});

Ici, nous enregistrons la classe Foo en mode singleton via la méthode singleton, ce qui signifie que la même instance de la classe Foo sera renvoyée à chaque fois que le service foo est appelé.

  1. Résumé

Le mécanisme de conteneur DI de Laravel simplifie grandement le processus de mise en œuvre de l'injection de dépendances, nous permettant de gérer et d'utiliser les dépendances de manière plus flexible et plus pratique. Lors de l'utilisation du framework Laravel, maîtriser l'utilisation des conteneurs DI améliorera considérablement notre efficacité de développement, et apportera également de nombreux avantages en termes de testabilité et de maintenabilité du code. Cet article présente les concepts de base, la mise en œuvre et l'utilisation des conteneurs DI dans Laravel. J'espère qu'il pourra être utile à tout le monde.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Article précédent:code chinois tronqué laravelArticle suivant:code chinois tronqué laravel