Laravel (5.5.33) 加载过程---instance方法(三)

2018-02-18 19:49:47来源:cnblogs.com作者:Sunlight1992人点击

分享

在bootstrap/app.php

/** * 对于其中的instance register singleton 方法到时候单独拎出来说明 *  * 1.设置基础路径 * 2.使用instance 方法 绑定app 和Illuminate/Foundation/Application类的关系 * 3.使用instance 方法 绑定Container 和Illuminate/Foundation/Application类的关系 * 4.app变量中注册事件服务EventServiceProvider * 5.app变量中注册日志服务LogServiceProvider * 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);        }    }

最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台