首頁 >php框架 >Laravel >laravel中make法的作用是什麼

laravel中make法的作用是什麼

WBOY
WBOY原創
2022-02-24 15:25:123027瀏覽

在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影片教學

以上是laravel中make法的作用是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn