laravel中make方法的作用是什么

2022-03-01 0 760

laravel中,make方法用于从容器当中解析一个type,该type是源码当中定义的,解析后返回的结果就是type的一个实例,容器类调用make方法时,若没有已注册的key,会自动通过反射类实例化具体类。

laravel中make方法的作用是什么

本文操作环境:Windows10系统、Laravel6版、Dell G3电脑。

laravel中make方法的作用是什么

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类为例)

     /**      * 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方法     }

好,我们一步一步的来,先看看这个getAlias方法,这个方法的作用就是返回这个类的别名,如果给出的是一个完整的类名且在aliases中已经设置了那么就返回这个类名的别名,如果没有设置过就返回这个类名本身,大家在看这个方法的时候可以先var_dump一下$app,对照着看里面的aliases数组,框架作者写这个方法真的很巧妙,至少这种递归方式在我实际开发当中很少用到。

    /**      * 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]);     }

接下来就是对deferredServices和instances这个两个数组进行判断,在本例 $kernel = $app->make(Illuminate\\Contracts\\Http\\Kernel::class); 当中,判断的结果为false,因此不执行loadDeferredProvider方法。

再接下来就是调用父类Illuminate\\Container\\Container中的make方法了,

     /**      * 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方法 }

【相关推荐:laravel视频教程】

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

【声明:根据2013年1月30日《计算机软件保护条例》2次修订第17条规定: 为了学习和研究软件内含的设计思想和原理,通过安装、显示、传输或者存 储软件等方式使用软件的,可以不经软件著作权人许可,不向其支付报酬! 鉴于此,也希望大家按此说明研究软件!】
本站所有源码尽量保证原汁原味,如有特殊情况会作出声明及标注,网站资源不做任何二次加密(原版加密除外,不影响程序使用的不会做解密处理),方便您更好的学习参考。 在您的能力范围内,为了大环境的良性发展,请尽可能的选择正版资源。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

即刻码站__国内靠谱的站长资源下载平台 php教程 laravel中make方法的作用是什么 https://www.jike1995.com/31843.html

常见问题
  • 本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用
查看详情
  • 最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度
查看详情

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务