Maison cadre php Laravel Récupérer l'instance de conteneur dans le code (Laravel)

Récupérer l'instance de conteneur dans le code (Laravel)

Aug 06, 2021 am 09:35 AM
laravel

Cet article est écrit par la colonne tutorielle laravel pour présenter comment obtenir l'instance de conteneur dans le code. J'espère qu'il sera utile aux amis qui en ont besoin !

L'instance de conteneur Laravel est unique tout au long du cycle de vie de la demande et gère toutes les instances de composants de service. Alors, quels sont les moyens d'obtenir une instance du conteneur Laravel ? Les méthodes suivantes sont couramment utilisées :

1) Via la fonction d'aide de l'application :

$app = app();
Copier après la connexion

La fonction auxiliaire de l'application est définie dans le fichier

Récupérer linstance de conteneur dans le code (Laravel)

Ce fichier définit de nombreuses fonctions d'aide et sera automatiquement chargé dans le fichier

. fichier via le projet composer. Par conséquent, les fonctions sont accessibles à n’importe quel emplacement de code impliqué dans le traitement des requêtes http, tel que app().

2) Via l'App Facade

<?php
Route::get(&#39;/&#39;, function () {
    dd(App::basePath());
    return &#39;&#39;;
});
Copier après la connexion
Copier après la connexion

La façon d'obtenir l'instance de conteneur via l'App Facade est différente de celle ci-dessus. Vous ne pouvez pas d'abord attribuer l'application à une variable, puis appeler la méthode du conteneur via la variable. En effet, App n'est qu'un nom de classe et nous ne pouvons pas copier un nom de classe dans une variable. $app = App; n'est pas une instruction exécutable légale, mais $app = app(); est une instruction exécutable légale, car elle est suivie par app(), indiquant un appel de fonction. App::basePath(); est également une déclaration légale, elle appelle la méthode statique de la classe.

Ajoutez 2 points supplémentaires :

Premier point : Facade est une fonctionnalité particulière du framework laravel. Chaque Facade sera associée à un objet instance dans le conteneur. Nous pouvons l'appeler directement via l'appel de méthode statique de la classe Facade. Méthodes de l'objet instance auquel il est associé. Par exemple, la façade de l'application, lors de l'appel de App::basePath(), est en fait équivalente à app()->basePath().

Ce mécanisme sous-jacent s'appuie également sur les caractéristiques du langage PHP. Il doit définir un membre statique dans chaque Facade et l'associer à un objet instance du service. Lorsque la méthode statique de la classe Facade est appelée, l'appel est effectué. nom de la méthode analysé, puis appelez la méthode du même nom de l'instance de service associée, et enfin renvoyez le résultat.

Je pense qu'il suffit de comprendre quel rôle Facade peut jouer. Il n'est pas nécessaire de se plonger dans sa couche inférieure pour comprendre les détails d'implémentation. Après tout, dans le développement réel, sans Facade, cela n'affecte pas l'utilisation de Laravel. cadre du tout. De plus, en codage réel, il est très simple de personnaliser une Facade. Il suffit d'hériter de la classe de base Facade encapsulée par laravel :

<?php
namespace ThirdProviders\CasServer\Facades;
use Illuminate\Support\Facades\Facade;
use ThirdProviders\CasServer\CasServerManager;
class CasServer extends Facade
{
    protected static function getFacadeAccessor()
    {
        return CasServerManager::class;
    }
}
Copier après la connexion

Implémentez la méthode getFacadeAccessor de la classe de base Facade, et le framework laravel saura quelle instance de service cette Facade. la classe doit être associée à. En fait, le nom renvoyé par cette méthode getFacadeAccess est le nom de liaison de service qui sera introduit ultérieurement. Dans le conteneur Laravel, une instance de service aura un nom de liaison fixe et l'instance pourra être trouvée via ce nom. Alors pourquoi la classe Facade doit-elle uniquement renvoyer le nom de liaison de service ?

On peut regarder le code de la classe App Facade :

<?php
namespace Illuminate\Support\Facades;
/**
 * @see \Illuminate\Foundation\Application
 */
class App extends Facade
{
    /**
     * Get the registered name of the component.
     *
     * @return string
     */
    protected static function getFacadeAccessor()
    {
        return &#39;app&#39;;
    }
}
Copier après la connexion

Son getFacadeAccessor renvoie une chaîne "app", qui est le nom utilisé par le conteneur laravel pour se lier.

Deuxième point : à partir du code source de l'App Facade au point précédent, nous pouvons voir que le nom complet de la classe de l'App Facade est en fait : IlluminateSupportFacadesApp, alors pourquoi pouvons-nous y accéder directement via le nom court de l'App dans le code ? :

<?php
Route::get(&#39;/&#39;, function () {
    dd(App::basePath());
    return &#39;&#39;;
});
Copier après la connexion
Copier après la connexion

Vous voyez que le code ci-dessus n'utilise pas de méthode pleinement qualifiée pour utiliser IlluminateSupportFacadesApp. En fait, App est complètement équivalent à IlluminateSupportFacadesApp, sauf qu'App est beaucoup plus court qu'IlluminateSupportFacadesApp et ne nécessite pas d'utilisation, il est donc pratique à utiliser. Alors, comment est-il implémenté ? Ceci est lié aux alias configurés dans le conteneur laravel. Dans config/app.php, il y a une section d'alias dédiée à la configuration de certains types d'alias :

&#39;aliases&#39; => [
    &#39;App&#39; => Illuminate\Support\Facades\App::class,
    &#39;Artisan&#39; => Illuminate\Support\Facades\Artisan::class,
    &#39;Auth&#39; => Illuminate\Support\Facades\Auth::class,
    &#39;Blade&#39; => Illuminate\Support\Facades\Blade::class,
    &#39;Bus&#39; => Illuminate\Support\Facades\Bus::class,
    &#39;Cache&#39; => Illuminate\Support\Facades\Cache::class,
    &#39;Config&#39; => Illuminate\Support\Facades\Config::class,
    &#39;Cookie&#39; => Illuminate\Support\Facades\Cookie::class,
    &#39;Crypt&#39; => Illuminate\Support\Facades\Crypt::class,
    &#39;DB&#39; => Illuminate\Support\Facades\DB::class,
    &#39;Eloquent&#39; => Illuminate\Database\Eloquent\Model::class,
    &#39;Event&#39; => Illuminate\Support\Facades\Event::class,
    &#39;File&#39; => Illuminate\Support\Facades\File::class,
    &#39;Gate&#39; => Illuminate\Support\Facades\Gate::class,
    &#39;Hash&#39; => Illuminate\Support\Facades\Hash::class,
    &#39;Lang&#39; => Illuminate\Support\Facades\Lang::class,
    &#39;Log&#39; => Illuminate\Support\Facades\Log::class,
    &#39;Mail&#39; => Illuminate\Support\Facades\Mail::class,
    &#39;Notification&#39; => Illuminate\Support\Facades\Notification::class,
    &#39;Password&#39; => Illuminate\Support\Facades\Password::class,
    &#39;Queue&#39; => Illuminate\Support\Facades\Queue::class,
    &#39;Redirect&#39; => Illuminate\Support\Facades\Redirect::class,
    &#39;Redis&#39; => Illuminate\Support\Facades\Redis::class,
    &#39;Request&#39; => Illuminate\Support\Facades\Request::class,
    &#39;Response&#39; => Illuminate\Support\Facades\Response::class,
    &#39;Route&#39; => Illuminate\Support\Facades\Route::class,
    &#39;Schema&#39; => Illuminate\Support\Facades\Schema::class,
    &#39;Session&#39; => Illuminate\Support\Facades\Session::class,
    &#39;Storage&#39; => Illuminate\Support\Facades\Storage::class,
    &#39;URL&#39; => Illuminate\Support\Facades\URL::class,
    &#39;Validator&#39; => Illuminate\Support\Facades\Validator::class,
    &#39;View&#39; => Illuminate\Support\Facades\View::class
],
Copier après la connexion

Puis lors du processus de traitement des requêtes du framework laravel, la classe IlluminateFoundationBootstrapRegisterFacades sera transmis Enregistrons ces alias dans l'environnement global :

<?php
namespace Illuminate\Foundation\Bootstrap;
use Illuminate\Support\Facades\Facade;
use Illuminate\Foundation\AliasLoader;
use Illuminate\Contracts\Foundation\Application;
class RegisterFacades
{
    /**
     * Bootstrap the given application.
     *
     * @param  \Illuminate\Contracts\Foundation\Application  $app
     * @return void
     */
    public function bootstrap(Application $app)
    {
        Facade::clearResolvedInstances();
        Facade::setFacadeApplication($app);
        AliasLoader::getInstance($app->make(&#39;config&#39;)->get(&#39;app.aliases&#39;, []))->register();
    }
}
Copier après la connexion
Nous pouvons donc utiliser directement des alias au lieu du nom de type complet pour effectuer la même fonction d'accès. Si vous avez écrit vous-même des classes avec des noms très longs et que vous les utilisez beaucoup dans le code, vous pouvez également envisager de les configurer dans l'alias config/app.php, et Laravel les enregistrera pour nous.

3) Une autre façon d'obtenir l'instance de conteneur Laravel est d'utiliser $this->app directement dans le fournisseur de services

Récupérer linstance de conteneur dans le code (Laravel)Le fournisseur de services sera présenté plus tard, mais il vient tout juste d'être introduit maintenant. Étant donné que les classes du fournisseur de services sont instanciées par le conteneur Laravel, ces classes héritent d'IlluminateSupportServiceProvider, qui définit un attribut d'instance $app

🎜🎜Lorsque Laravel instancie le fournisseur de services, il injectera l'instance du conteneur Laravel Allez dans ce $app. Ainsi, chez le fournisseur de services, nous pouvons toujours accéder à l'instance de conteneur Laravel via $this->$app, sans utiliser la fonction app() ou App Facade. 🎜

Pour plus d'articles techniques sur Laravel, veuillez visiter la colonne tutoriel laravel !

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 de ce site Web
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

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

Video Face Swap

Video Face Swap

Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Comment obtenir le code de retour lorsque l'envoi par e-mail échoue à Laravel? Comment obtenir le code de retour lorsque l'envoi par e-mail échoue à Laravel? Apr 01, 2025 pm 02:45 PM

Méthode pour obtenir le code de retour lorsque l'envoi par e-mail de Laravel échoue. Lorsque vous utilisez Laravel pour développer des applications, vous rencontrez souvent des situations où vous devez envoyer des codes de vérification. Et en réalité ...

La tâche de calendrier Laravel n'est pas exécutée: que dois-je faire si la tâche n'est pas en cours d'exécution après le calendrier: Exécuter la commande? La tâche de calendrier Laravel n'est pas exécutée: que dois-je faire si la tâche n'est pas en cours d'exécution après le calendrier: Exécuter la commande? Mar 31, 2025 pm 11:24 PM

Laravel Schedule Tâche d'exécution de dépannage non réactif Lorsque vous utilisez la planification des tâches de calendrier de Laravel, de nombreux développeurs rencontreront ce problème: Schedule: Exécuter ...

Dans Laravel, comment gérer la situation où les codes de vérification ne sont pas envoyés par e-mail? Dans Laravel, comment gérer la situation où les codes de vérification ne sont pas envoyés par e-mail? Mar 31, 2025 pm 11:48 PM

La méthode de traitement de l'échec de l'e-mail de Laravel à envoyer le code de vérification est d'utiliser Laravel ...

Comment implémenter la fonction de table personnalisée de clic pour ajouter des données dans l'administrateur DCAT? Comment implémenter la fonction de table personnalisée de clic pour ajouter des données dans l'administrateur DCAT? Apr 01, 2025 am 07:09 AM

Comment implémenter la fonction du tableau de Cliquez sur personnalisé pour ajouter des données dans DCATADMIN (Laravel-Admin) lors de l'utilisation de DCAT ...

Partage de connexion Laravel Redis: pourquoi la méthode de sélection affecte-t-elle d'autres connexions? Partage de connexion Laravel Redis: pourquoi la méthode de sélection affecte-t-elle d'autres connexions? Apr 01, 2025 am 07:45 AM

L'impact du partage des connexions redis dans Laravel Framework et sélectionnez Méthodes Lors de l'utilisation de Laravel Framework et Redis, les développeurs peuvent rencontrer un problème: grâce à la configuration ...

Laravel Multi-Lenant Extension Stancl / Tenancy: Comment personnaliser l'adresse hôte d'une connexion de base de données de locataire? Laravel Multi-Lenant Extension Stancl / Tenancy: Comment personnaliser l'adresse hôte d'une connexion de base de données de locataire? Apr 01, 2025 am 09:09 AM

Connexion de la base de données des locataires personnalisés dans le package d'extension multi-locataire Laravel Stancl / location Lors de la construction d'applications multi-locataires à l'aide du package d'extension multi-locataire Laravel Stancl / location, ...

Laravel Eloquent Orm dans Bangla Partial Model Search) Laravel Eloquent Orm dans Bangla Partial Model Search) Apr 08, 2025 pm 02:06 PM

Laravelelognent Model Retrieval: Faconttement l'obtention de données de base de données Eloquentorm fournit un moyen concis et facile à comprendre pour faire fonctionner la base de données. Cet article présentera en détail diverses techniques de recherche de modèles éloquentes pour vous aider à obtenir efficacement les données de la base de données. 1. Obtenez tous les enregistrements. Utilisez la méthode All () pour obtenir tous les enregistrements dans la table de base de données: usApp \ Modèles \ Post; $ poters = post :: all (); Cela rendra une collection. Vous pouvez accéder aux données à l'aide de Foreach Loop ou d'autres méthodes de collecte: ForEach ($ PostsAs $ POST) {echo $ post->

Géospatial de Laravel: optimisation des cartes interactives et de grandes quantités de données Géospatial de Laravel: optimisation des cartes interactives et de grandes quantités de données Apr 08, 2025 pm 12:24 PM

Traiter efficacement 7 millions d'enregistrements et créer des cartes interactives avec la technologie géospatiale. Cet article explore comment traiter efficacement plus de 7 millions d'enregistrements en utilisant Laravel et MySQL et les convertir en visualisations de cartes interactives. Exigences initiales du projet de défi: extraire des informations précieuses en utilisant 7 millions d'enregistrements dans la base de données MySQL. Beaucoup de gens considèrent d'abord les langages de programmation, mais ignorent la base de données elle-même: peut-il répondre aux besoins? La migration des données ou l'ajustement structurel est-il requis? MySQL peut-il résister à une charge de données aussi importante? Analyse préliminaire: les filtres et les propriétés clés doivent être identifiés. Après analyse, il a été constaté que seuls quelques attributs étaient liés à la solution. Nous avons vérifié la faisabilité du filtre et établi certaines restrictions pour optimiser la recherche. Recherche de cartes basée sur la ville

See all articles