Maison > cadre php > Laravel > Quelle est la fonction de la méthode make dans Laravel

Quelle est la fonction de la méthode make dans Laravel

WBOY
Libérer: 2022-02-24 15:25:12
original
3030 Les gens l'ont consulté

Dans Laravel, la méthode make est utilisée pour analyser un type du conteneur. Le type est défini dans le code source. Le résultat renvoyé après l'analyse est une instance du type lorsque la classe conteneur appelle la méthode make, le cas échéant. n'y a pas de clé enregistrée, les classes concrètes sont automatiquement instanciées via des classes de réflexion.

Quelle est la fonction de la méthode make dans Laravel

L'environnement d'exploitation de cet article : système Windows 10, Laravel version 6, ordinateur Dell G3.

Quel est le rôle de la méthode make dans Laravel ?

La méthode make dans Laravel est utilisée pour analyser un type du conteneur. Ce type est défini dans le code source et n'est pas facile à traduire en chinois. Le résultat renvoyé après l'analyse est une instance de type.

Les étudiants qui ont lu le code source doivent savoir qu'il existe une méthode make dans la classe IlluminateFoundationApplication et sa classe parent IlluminateContainerContainer. Ensuite, lors de l'exécution de cette ligne de code dans index.php,

1 $kernel = $app->. ; make(IlluminateContractsHttpKernel::class);

, la méthode make dans IlluminateFoundationApplication sera exécutée en premier, alors jetons-y un coup d'œil d'abord. (Cet article prend la classe make Kernel comme exemple)

     /**
      * Resolve the given type from the container. 从容器当中解析给定的type
      *
      * (Overriding Container::make) 覆盖了父类中的make方法
      *
      * @param  string  $abstract 给定的type
      * @param  array  $parameters 指定一些参数 可选项
      * @return mixed
      */
     public function make($abstract, array $parameters = [])
     {
         $abstract = $this->getAlias($abstract);//调用父类中的getAlias方法
      //如果在deferredServices这个数组设置了这个type并且在instances数组中没有设置这个type
         if (isset($this->deferredServices[$abstract]) && ! isset($this->instances[$abstract])) {
             $this->loadDeferredProvider($abstract);//那么就执行这个方法:加载被定义为延迟的服务提供者
       }
 
         return parent::make($abstract, $parameters);//调用父类的make方法
     }
Copier après la connexion

D'accord, allons-y étape par étape. Jetons d'abord un coup d'œil à la méthode getAlias ​​​​La fonction de cette méthode est de renvoyer l'alias de cette classe. Si un complet Si le nom de la classe a été défini dans les alias, alors l'alias du nom de la classe sera renvoyé. S'il n'a pas été défini, le nom de la classe lui-même sera renvoyé. Lorsque vous regardez cette méthode, vous pouvez var_dump $app. d'abord et comparez-le avec le tableau d'alias à l'intérieur, l'auteur du framework a écrit cette méthode très intelligemment, au moins cette méthode récursive est rarement utilisée dans mon développement actuel.

    /**
      * Get the alias for an abstract if available.
     *
     * @param  string  $abstract
     * @return string
    *
     * @throws \LogicException
     */
    public function getAlias($abstract)
    {
         if (! isset($this->aliases[$abstract])) {
            return $abstract;
         }
 
        if ($this->aliases[$abstract] === $abstract) {
            throw new LogicException("[{$abstract}] is aliased to itself.");
        }
        return $this->getAlias($this->aliases[$abstract]);
     }
Copier après la connexion

L'étape suivante consiste à juger les deux tableaux de deferredServices et d'instances. Dans cet exemple, $kernel = $app->make(IlluminateContractsHttpKernel::class);, le résultat du jugement est faux, donc la méthode loadDeferredProvider. n'est pas exécuté.

L'étape suivante consiste à appeler la méthode make dans la classe parent IlluminateContainerContainer,

     /**
      * Resolve the given type from the container.
      *
      * @param  string  $abstract
      * @param  array  $parameters
      * @return mixed
     */
     public function make($abstract, array $parameters = [])
     {
      return $this->resolve($abstract, $parameters);//直接调用resolve方法
 }
Copier après la connexion

[Recommandation associée : tutoriel vidéo 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!

Étiquettes associées:
source:php.cn
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal