Si vous avez déjà rencontré le framework Laravel, il est fort peu probable que vous n’ayez pas entendu parler de conteneurs de services et de fournisseurs de services. En fait, ils sont l’épine dorsale du framework Laravel et font le gros du travail lorsque vous lancez une instance d’une application Laravel..
Dans cet article, nous allons avoir un aperçu de ce qu'est le conteneur de services. Ensuite, nous discuterons en détail du fournisseur de services. Dans le cadre de cet article, je montrerai également comment créer un fournisseur de services personnalisé à Laravel. Une fois que vous avez créé un fournisseur de services, vous devez également l'enregistrer auprès de l'application Laravel pour pouvoir l'utiliser, afin que nous puissions l'examiner également..
Votre fournisseur de services peut implémenter deux méthodes importantes, boot et register, et dans la dernière partie de cet article, nous aborderons ces deux méthodes de manière approfondie..
Avant de plonger dans la discussion d'un fournisseur de services, je vais essayer de vous présenter le conteneur de services, car il sera largement utilisé dans la mise en œuvre de votre fournisseur de services..
En termes simples, nous pourrions dire que le conteneur de services de Laravel est une boîte contenant les liaisons de divers composants, qui sont servis selon les besoins dans l'application..
Dans les mots de la documentation officielle de Laravel:
Le conteneur de services Laravel est un outil puissant pour gérer les dépendances de classe et effectuer une injection de dépendance..
Ainsi, chaque fois que vous avez besoin d'injecter un composant ou un service intégré, vous pouvez taper hint dans votre constructeur ou votre méthode, et il sera automatiquement injecté à partir du conteneur de service car il contient tout ce dont vous avez besoin! N'est-ce pas cool? Cela vous évite d’instancier manuellement les composants et évite ainsi un couplage étroit dans votre code.
Regardons un exemple rapide pour le comprendre.
Classe SomeClass fonction publique __construct (FooBar $ foobarObject) // utilise l'objet $ foobarObject
Comme vous pouvez le voir, le Une classe
a besoin d'une instance de FooBar
s'instancier. Donc, au fond, il y a une dépendance à injecter. Laravel le fait automatiquement en examinant le conteneur de services et en injectant la dépendance appropriée..
Et si vous vous demandez comment Laravel sait quels composants ou services inclure dans le conteneur de services, la réponse est le fournisseur de services. C'est le fournisseur de services qui demande à Laravel de lier divers composants au conteneur de services. En fait, cela s'appelle des liaisons de conteneur de service, et vous devez le faire via le fournisseur de service.
C'est donc le fournisseur de services qui enregistre toutes les liaisons de conteneur de services, et cela via la méthode register de la mise en œuvre du fournisseur de services.
Cela devrait amener une autre question sur la table: comment Laravel est-il au courant des différents fournisseurs de services? Vous venez de dire quelque chose? Je viens d'entendre quelqu'un dire cela, Laravel devrait aussi comprendre cela automatiquement! Oh mon Dieu, c'est trop demander: Laravel est un cadre, pas un surhomme, n'est-ce pas? Kidding apart, c'est quelque chose que vous devez informer explicitement Laravel.
Allez-y et regardez le contenu de la config / app.php
fichier. Vous trouverez une entrée de tableau qui répertorie tous les fournisseurs de services qui seront chargés lors du démarrage de l'application Laravel..
'providers' => [/ * * Fournisseurs de services Laravel Framework… * / Illuminate \ Auth \ AuthServiceProvider :: class, Illuminate \ Broadcasting \ BroadcastServiceProvider :: class, Illuminate \ Bus \ BusServiceProvider :: class, Illuminate \ Broadcasting \ BroadcastServiceProvider :: class, Illuminate \ Bus \ ServiceServiceProvider :: class, Illuminate \ Cache \ CacheServiceProvider :: classe, Illuminate \ Foundation \ Providers \ ConsoleSupportServiceProvider :: class, Illuminate \ Cookie \ CookieServiceProvider :: class, Illuminate \ Database \ DatabaseServiceProvider :: class, Illuminate \ EncryptionServiceProvider :: class, Illuminate \ Database \ DatabaseServiceProvider :: class, Illuminate \ EncryptionServiceProvider :: class, Illuminate \ FilesystemServiceProvider \ Foundation \ Providers \ FoundationServiceProvider :: class, Illuminate \ Hashing \ HashServiceProvider :: class, Illuminate \ Mail \ MailServiceProvider :: class, Illuminate \ Notifications \ NotificationServiceProvider :: class, Illuminate \ Pagination \ PaginationServiceProvider :: class, Illuminate \ Pipeline \ PipelineServiceProvider :: class, Illuminate \ Queue \ QueueServiceProvider :: class, Illuminate \ Redis \ RedisServiceProvider :: class, Illuminate \ Auth \ Passwords \ PasswordResetServiceP rovider :: class, Illuminate \ Session \ SessionServiceProvider :: class, Illuminate \ Translation \ TranslationServiceProvider :: class, Illuminate \ Validation \ ValidationServiceProvider :: class, Illuminate \ View \ ViewServiceProvider :: class, / * * Fournisseurs de services de packages… * / Laravel \ Tinker \ TinkerServiceProvider :: class, / * * Fournisseurs de services d'application… * / App \ Providers \ AppServiceProvider :: class, App \ Providers \ AuthServiceProvider :: class, // App \ Providers \ BroadcastServiceProvider :: class, App \ Providers \ EventServiceProvider :: class, App \ Providers \ RouteServiceProvider :: class,],
C'était donc le conteneur de services mis à votre disposition. À partir de la section suivante, nous allons nous concentrer sur le fournisseur de services, qui est le sujet principal de cet article.!
Si le conteneur de services est quelque chose qui vous permet de définir des liaisons et d'injecter des dépendances, le fournisseur de services est l'endroit où cela se produit..
Jetons un coup d'œil à l'un des principaux fournisseurs de services pour comprendre ce qu'il fait. Allez-y et ouvrez le vender / laravel / framework / src / Illuminate / Cache / CacheServiceProvider.php
fichier.
public function register () $ this-> app-> singleton ('cache', fonction ($ app) retourne un nouveau CacheManager ($ app);); $ this-> app-> singleton ('cache.store', fonction ($ app) return $ app ['cache'] -> driver ();); $ this-> app-> singleton ('memcached.connector', function () renvoie new MemcachedConnector;);
La chose importante à noter ici est la registre
méthode, qui vous permet de définir des liaisons de conteneur de service. Comme vous pouvez le constater, il existe trois liaisons pour le cache
, cache.store
et memcached.connector
prestations de service.
En gros, nous informons Laravel que chaque fois qu’il est nécessaire de résoudre un cache
entrée, il devrait retourner l'instance de CacheManager
. Nous ajoutons donc simplement une sorte de mappage dans le conteneur de services auquel on peut accéder via $ this-> app
.
C’est la bonne façon d’ajouter un service à un conteneur de services Laravel. Cela vous permet également de mieux comprendre comment Laravel utilise la méthode d’enregistrement de tous les fournisseurs de services et remplit le conteneur de services! Et comme nous l’avons mentionné précédemment, il reprend la liste des fournisseurs de services de la config / app.php
fichier.
Et c'est l'histoire du fournisseur de services. Dans la section suivante, nous verrons comment créer un fournisseur de services personnalisé afin de pouvoir enregistrer vos services personnalisés dans le conteneur de services Laravel..
Laravel est déjà livré avec un utilitaire pratique en ligne de commande, artisan
, qui vous permet de créer un code de gabarit afin de ne pas avoir à le créer à partir de zéro. Allez-y, passez à la ligne de commande et exécutez la commande suivante à la racine de votre application pour créer un fournisseur de services personnalisé..
$ php fabrication artisanale: fournisseur EnvatoCustomServiceProvider Fournisseur créé avec succès.
Et cela devrait créer le fichier EnvatoCustomServiceProvider.php
sous le app / fournisseurs
annuaire. Ouvrez le fichier pour voir ce qu'il contient.
Comme nous en avons discuté précédemment, il existe deux méthodes, de démarrage et d'enregistrement, avec lesquelles vous traiterez la plupart du temps lorsque vous travaillez avec votre fournisseur de services personnalisé..
le
registre
méthode est l'endroit où vous définissez toutes vos liaisons de conteneur de service personnalisé. D'autre part, ledémarrage
méthode est le lieu où vous pouvez utiliser des services déjà enregistrés via la méthode d’enregistrement. Dans la dernière partie de cet article, nous allons discuter de ces deux méthodes en détail, puis nous allons passer en revue quelques cas d'utilisation pratiques pour comprendre l'utilisation de ces deux méthodes..Enregistrez votre fournisseur de service personnalisé
Vous avez donc créé votre fournisseur de service personnalisé. C'est génial! Ensuite, vous devez informer Laravel de votre fournisseur de services personnalisé afin qu’il puisse le charger avec d’autres fournisseurs de services lors de l’amorçage..
Pour enregistrer votre fournisseur de services, il vous suffit d’ajouter une entrée à l’ensemble des fournisseurs de services du répertoire.
config / app.php
fichier.'providers' => [/ * * Fournisseurs de services Laravel Framework… * / Illuminate \ Auth \ AuthServiceProvider :: class, Illuminate \ Broadcasting \ BroadcastServiceProvider :: class, Illuminate \ Bus \ BusServiceProvider :: class, Illuminate \ Broadcasting \ BroadcastServiceProvider :: class, Illuminate \ Bus \ ServiceServiceProvider :: class, Illuminate \ Cache \ CacheServiceProvider :: classe, Illuminate \ Foundation \ Providers \ ConsoleSupportServiceProvider :: class, Illuminate \ Cookie \ CookieServiceProvider :: class, Illuminate \ Database \ DatabaseServiceProvider :: class, Illuminate \ EncryptionServiceProvider :: class, Illuminate \ Database \ DatabaseServiceProvider :: class, Illuminate \ EncryptionServiceProvider :: class, Illuminate \ FilesystemServiceProvider \ Foundation \ Providers \ FoundationServiceProvider :: class, Illuminate \ Hashing \ HashServiceProvider :: class, Illuminate \ Mail \ MailServiceProvider :: class, Illuminate \ Notifications \ NotificationServiceProvider :: class, Illuminate \ Pagination \ PaginationServiceProvider :: class, Illuminate \ Pipeline \ PipelineServiceProvider :: class, Illuminate \ Queue \ QueueServiceProvider :: class, Illuminate \ Redis \ RedisServiceProvider :: class, Illuminate \ Auth \ Passwords \ PasswordResetServiceP rovider :: class, Illuminate \ Session \ SessionServiceProvider :: class, Illuminate \ Translation \ TranslationServiceProvider :: class, Illuminate \ Validation \ ValidationServiceProvider :: class, Illuminate \ View \ ViewServiceProvider :: class, / * * Fournisseurs de services de packages… * / Laravel \ Tinker \ TinkerServiceProvider :: class, / * * Fournisseurs de services d'application… * / App \ Providers \ AppServiceProvider :: class, App \ Providers \ AuthServiceProvider :: class, // App \ Providers \ BroadcastServiceProvider :: class, App \ Providers \ EventServiceProvider :: class, App \ Providers \ RouteServiceProvider :: class, App \ Providers \ EnvatoCustomServiceProvider :: class,],Et c'est tout! Vous avez enregistré votre fournisseur de services avec le schéma de Laravel! Mais le fournisseur de services que nous avons créé est presque un modèle vierge et ne sert à rien pour le moment. Dans la section suivante, nous allons passer en revue quelques exemples pratiques pour voir ce que vous pouvez faire avec les méthodes register et boot..
Parcourir les méthodes de registre et de démarrage
Pour commencer, nous allons passer par le
registre
méthode pour comprendre comment vous pouvez réellement l'utiliser. Ouvrir le fichier du fournisseur de serviceapp / Providers / EnvatoCustomServiceProvider.php
qui a été créé précédemment et remplace le code existant par le suivant.app-> bind ('App \ Bibliothèque \ Services \ DemoOne', fonction ($ app) retourne une nouvelle DemoOne (););Il y a deux choses importantes à noter ici:
App \ Bibliothèque \ Services \ DemoOne
afin que nous puissions l'utiliser. le DemoOne
la classe n'est pas encore créée, mais nous le ferons dans un instant.lier
méthode du conteneur de service pour ajouter notre liaison de conteneur de service. Donc, chaque fois que le App \ Bibliothèque \ Services \ DemoOne
la dépendance doit être résolue, il va appeler la fonction de fermeture, et il instancie et renvoie le App \ Bibliothèque \ Services \ DemoOne
objet.Il suffit donc de créer le app / Bibliothèque / Services / DemoOne.php
déposer pour que cela fonctionne.
Et voici le code quelque part dans votre contrôleur où la dépendance sera injectée.
doSchethingUseful ();C'est un exemple très simple de liaison d'une classe. En fait, dans l'exemple ci-dessus, il n'est pas nécessaire de créer un fournisseur de service et d'implémenter la méthode de registre comme nous l'avons fait, car Laravel peut le résoudre automatiquement en utilisant la réflexion.
Une note très importante de la documentation de Laravel:
Il n'est pas nécessaire de lier des classes au conteneur si elles ne dépendent d'aucune interface. Le conteneur n'a pas besoin d'être renseigné sur la construction de ces objets, car il peut automatiquement résoudre ces objets à l'aide de la réflexion..Par contre, cela aurait été vraiment utile si vous aviez lié une interface à une implémentation donnée. Passons en exemple pour le comprendre.
Créons une interface très simple sur
app / Bibliothèque / Services / Contrats / CustomServiceInterface.php
.Ensuite, créons deux implémentations concrètes de cette interface. Fondamentalement, nous avons juste besoin de créer deux classes qui étendent la
CustomServiceInterface
interface.Créer le
DemoOne
cours enapp / Bibliothèque / Services / DemoOne.php
.De même,
DemoTwo
va dansapp / Bibliothèque / Services / DemoTwo.php
.Maintenant, au lieu de lier une classe, nous allons lier une interface. Revisiter
EnvatoCustomServiceProvider.php
et changez le code comme indiqué ci-dessous.app-> bind ('App \ Bibliothèque \ Services \ Contrats \ CustomServiceInterface', fonction ($ app) retourne un nouveau DemoOne (););Dans ce cas, nous avons lié le
App \ Bibliothèque \ Services \ Contrats \ CustomServiceInterface
interface auDemoOne
la mise en oeuvre. Par conséquent, chaque fois que leApp \ Bibliothèque \ Services \ Contrats \ CustomServiceInterface
la dépendance doit être résolue, elle instancie et renvoie leApp \ Bibliothèque \ Services \ DemoOne
objet. Maintenant, cela a plus de sens, n'est-ce pas?Revoyons rapidement le code du contrôleur.
doSchethingUseful ();Comme vous l'avez peut-être deviné, le
$ customServiceInstance
devrait être l'instance deApp \ Bibliothèque \ Services \ DemoOne
! La beauté de cette approche est que vous pouvez échanger leDemoOne
mise en œuvre avec l'autre facilement.Disons que vous voulez utiliser le
DemoTwo
mise en œuvre au lieu deDemoOne
. Dans ce cas, il vous suffit d’apporter les modifications suivantes au fournisseur de services.EnvatoCustomServiceProvider.php
.Trouvez la ligne suivante:
utilisez App \ Library \ Services \ DemoOne;Et remplacez-le par:
utilisez App \ Library \ Services \ DemoTwo;De même, trouvez celui-ci:
renvoyer new DemoOne ();Cela devrait être remplacé par:
renvoie new DemoTwo ();La même approche peut être utilisée si vous souhaitez remplacer une implémentation principale par la vôtre. Et ce n'est pas seulement la méthode de liaison que vous pouvez utiliser pour vos liaisons de conteneur de services; le conteneur de services Laravel fournit divers moyens de liaison au conteneur de services. Veuillez consulter la documentation officielle de Laravel pour la référence complète..
Le prochain candidat est le
démarrage
méthode, que vous pouvez utiliser pour étendre les fonctionnalités de base de Laravel. Avec cette méthode, vous pouvez accéder à tous les services enregistrés à l'aide de la méthode d'enregistrement du fournisseur de services. Dans la plupart des cas, vous souhaitez enregistrer vos écouteurs d'événements avec cette méthode, qui sera déclenchée lorsqu'un événement survient..Voyons quelques exemples nécessitant l'implémentation de la méthode de démarrage.
Vous voulez ajouter votre propre validateur de champ de formulaire personnalisé à Laravel.
fonction publique boot () Validator :: extend ('my_custom_validator', fonction (attribut $, valeur, $ paramètres, $ validateur) // la logique de validation va ici…);Si vous souhaitez enregistrer un compositeur de vues, c'est l'endroit idéal pour le faire! En fait, on pourrait dire que la méthode de démarrage est fréquemment utilisée pour ajouter des compositeurs de vues!
fonction publique boot () View :: composer ('demo', 'App \ Http \ ViewComposers \ DemoComposer');Bien sûr, vous voulez importer une façade
Illuminate \ Support \ Facades \ View
dans votre fournisseur de service en premier lieu.Sur le même territoire, vous pouvez également partager les données sur plusieurs vues.!
fonction publique boot () View :: share ('clé', 'valeur');Il peut également être utilisé pour définir des liaisons de modèle explicites.
fonction publique boot () parent :: boot (); Route :: model ('utilisateur', App \ User :: class);Voici quelques exemples illustrant l’utilisation de la méthode de démarrage. Plus vous entrez dans Laravel, plus vous trouverez de raisons de le mettre en œuvre!
Et avec cela, nous avons atteint la fin de cet article. J'espère que vous avez apprécié les sujets abordés tout au long de cet article.
Conclusion
C’est la discussion avec les fournisseurs de services qui a été l’attrait principal de cet article, bien que nous ayons commencé notre article avec le conteneur de services car c’était un élément important pour comprendre le fournisseur de services..
Suite à cela, nous avons développé un fournisseur de service personnalisé, et dans la dernière moitié de l'article, nous avons présenté quelques exemples pratiques..
Pour ceux d'entre vous qui débutent avec Laravel ou qui souhaitent développer leurs connaissances, leur site ou leur application avec des extensions, nous pouvons étudier de nombreuses choses sur Envato Market..
Si vous avez des questions ou des commentaires, envoyez-le en utilisant le flux ci-dessous.!