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.
L'environnement d'exploitation de cet article : système Windows 10, Laravel version 6, ordinateur Dell G3.
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方法 }
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]); }
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方法 }
[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!