laravel中make方法的作用是什么
时间:2022-04-11 17:02
在laravel中,make方法用于从容器当中解析一个type,该type是源码当中定义的,解析后返回的结果就是type的一个实例,容器类调用make方法时,若没有已注册的key,会自动通过反射类实例化具体类。 本文操作环境:Windows10系统、Laravel6版、Dell G3电脑。 Laravel中的make方法是用来从容器当中解析一个type,这个type是源码当中定义的,不是很好翻译成中文。解析后返回的结果就是type的一个实例。 看过源码的同学应该知道在Illuminate\Foundation\Application这个类和它的父类Illuminate\Container\Container类中都有make方法,那么当执行如index.php中的这行代码, 1 $kernel = $app->make(Illuminate\Contracts\Http\Kernel::class); 的时候,就会首先去执行Illuminate\Foundation\Application中的make方法,那么我们就先看看它。(这篇文章就以make这个Kernel类为例) 好,我们一步一步的来,先看看这个getAlias方法,这个方法的作用就是返回这个类的别名,如果给出的是一个完整的类名且在aliases中已经设置了那么就返回这个类名的别名,如果没有设置过就返回这个类名本身,大家在看这个方法的时候可以先var_dump一下$app,对照着看里面的aliases数组,框架作者写这个方法真的很巧妙,至少这种递归方式在我实际开发当中很少用到。 接下来就是对deferredServices和instances这个两个数组进行判断,在本例 $kernel = $app->make(Illuminate\Contracts\Http\Kernel::class); 当中,判断的结果为false,因此不执行loadDeferredProvider方法。 再接下来就是调用父类Illuminate\Container\Container中的make方法了, 【相关推荐:laravel视频教程】 以上就是laravel中make方法的作用是什么的详细内容,更多请关注gxlsystem.com其它相关文章!laravel中make方法的作用是什么
/**
* 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方法
}
/**
* 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]);
}
/**
* 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方法
}