Laravel 5.5) 載入過程instance方法

來源:互聯網
上載者:User
在bootstrap/app.php

/** * 對於其中的instance register singleton 方法到時候單獨拎出來說明 *  * 1.設定基礎路徑 * 2.使用instance 方法 綁定app 和Illuminate\Foundation\Application類的關係 * 3.使用instance 方法 綁定Container 和Illuminate\Foundation\Application類的關係 * 4.app變數中註冊事件服務EventServiceProvider * 5.app變數中註冊Log ServiceLogServiceProvider * 6.app變數中註冊路由服務RoutingServiceProvider * 7.別名的註冊(vendor/laravel/framework/src/Illuminate/Foundation/Application.php檔案中的 registerCoreContainerAliases 方法) */$app = new Illuminate\Foundation\Application(    realpath(__DIR__.'/../'));

執行個體化 vendor/laravel/framework/src/Illuminate/Foundation/Application.php類 該類的魔術方法

    public function __construct($basePath = null)    {        /**         * 如果有傳地址  設定基礎路徑 設定          * path                 $this->path()         * path.base              $this->basePath()         * path.lang             $this->langPath()         * path.config             $this->configPath()         * path.public            $this->publicPath()         * path.storage            $this->storagePath()         * path.database        $this->databasePath()         * path.resources        $this->resourcePath()         * path.bootstrap         $this->bootstrapPath()         */        if ($basePath) {            $this->setBasePath($basePath);        }        /**         * 註冊 app 和container到 instances數組中         */        $this->registerBaseBindings();        /**         * 註冊EventServiceProvider LogServiceProvider  RoutingServiceProvider         */        $this->registerBaseServiceProviders();        /**         * 設定核心類的別名         */        $this->registerCoreContainerAliases();    }

查看註冊 app 和container到 instances數組中

    protected function registerBaseBindings()    {        static::setInstance($this);        /**         * 由於初始化中  app沒有添加到instances數組中 所以 不會執行build函數  只做了 instances數組中記錄了app和$this         */        $this->instance('app', $this);        /**         * 由於初始化中  Container沒有添加到instances數組中 所以 不會執行build函數 只做了 instances數組中記錄了app和$this         */        $this->instance(Container::class, $this);    }

查看今天主要的方法 instance

流程圖

 public function instance($abstract, $instance)    {        /**         * 如果aliases 數組總存在  則游離abstractAliases 數組  刪除其中的存在的值         */        $this->removeAbstractAlias($abstract);        /**         * 判斷  在bindings aliases instances其中有一個存現  則返回true         */        $isBound = $this->bound($abstract);        /**         * 刪除別名數組中對於的建         */        unset($this->aliases[$abstract]);        // We'll check to determine if this type has been bound before, and if it has        // we will fire the rebound callbacks registered with the container and it        // can be updated with consuming classes that have gotten resolved here.        /**         * 在instances 數組中添加對於的建         */        $this->instances[$abstract] = $instance;        /**         * 如果之前存在執行個體化 則運行         */        if ($isBound) {            $this->rebound($abstract);        }    }

第一個方法 removeAbstractAlias

    /**     * Remove an alias from the contextual binding alias cache.     *     * @param  string  $searched     * @return void     */    protected function removeAbstractAlias($searched)    {        /**         * 如果在別名數組中不存在則直接返回         */        if (! isset($this->aliases[$searched])) {            return;        }        /**         * 游離抽象別名 吧存在抽象類別名數組中的存在的刪除         * @example abstractAliases = ['nameabstract'=>['aliase1','aliases2']]         */        foreach ($this->abstractAliases as $abstract => $aliases) {            foreach ($aliases as $index => $alias) {                if ($alias == $searched) {                    unset($this->abstractAliases[$abstract][$index]);                }            }        }    }

第二個方法: bound

    /**     * Determine if the given abstract type has been bound.     *     * @param  string  $abstract     * @return bool     */    public function bound($abstract)    {        return isset($this->bindings[$abstract]) ||               isset($this->instances[$abstract]) ||               $this->isAlias($abstract);    }

第三個方法: rebound

 /**     * Fire the "rebound" callbacks for the given abstract type.     *     * @param  string  $abstract     * @return void     */    protected function rebound($abstract)    {        /**         * 主要實現的功能為 build 方法 執行個體化制定的類 並且返回該類          */        $instance = $this->make($abstract);        /**         * 查看reboundCallbacks 數組中是否存在該別名建立完成之後需要調用的方法數組          * 存在返回需要調用的方法數組   並且逐個執行         */        foreach ($this->getReboundCallbacks($abstract) as $callback) {            call_user_func($callback, $this, $instance);        }    }

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.