[laravel源码]Application/register解析流程
说明
本章节说明容器中 register
的解析过程。
源码
vendor\laravel\framework\src\Illuminate\Foundation\Application.php
public function register($provider, $force = false)
{
// 1. 容器中是否已注册,已注册直接返回,否则继续往下
if (($registered = $this->getProvider($provider)) && ! $force) {
return $registered;
}
if (is_string($provider)) {
$provider = $this->resolveProvider($provider);
}
// 2. 执行 register
if (method_exists($provider, 'register')) {
$provider->register();
}
// 3. 如果具备 bindings/singleton 属性,则进入 bind/singleton 流程
// singleton() 内调用 bind($k,$v,true),区别在于第三个参数
if (property_exists($provider, 'bindings')) {
foreach ($provider->bindings as $key => $value) {
$this->bind($key, $value);
}
}
if (property_exists($provider, 'singletons')) {
foreach ($provider->singletons as $key => $value) {
$this->singleton($key, $value);
}
}
// 4. 标记
$this->markAsRegistered($provider);
// 5. 已boot,则调用boot
if ($this->booted) {
$this->bootProvider($provider);
}
return $provider;
}
分析
- register与boot的先后顺序
- boot只有容器
booted
为真时才调用
本作品采用《CC 协议》,转载必须注明作者和本文链接
插眼