在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);
}
}