Illuminate\Foundation\Application
从make方法说起
一、make()
$kernel = $app->make(Illuminate\Contracts\Http\Kernel::class);
1.getAlias()
make()首先调用了这个方法
if (! isset($this->aliases[$abstract])) {
return $abstract;
}
return $this->getAlias($this->aliases[$abstract]);
如果注册过那么递归调用自身直到返回的value是没注册过的;如果没注册,那么直接返回参数
2.loadDeferredProvider()
这里是关于另外一个叫做 $this->deferredServices
的注册表,做什么的未知,看名字应该是和延迟加载有点关系的.
if (! isset($this->deferredServices[$service])) {
return;
}
$provider = $this->deferredServices[$service];
if (! isset($this->loadedProviders[$provider])) {
$this->registerDeferredProvider($provider, $service);
}
没注册过返回null,如果注册过那么取出value值(称为provider),这里出现了第三个注册表$this->loadedProviders
。如果provider值未注册过,那么调用registerDeferredProvider()
方法
2.1 registerDeferredProvider()
service => Providers
if ($service) {
unset($this->deferredServices[$service]);
}
先unset掉service表中的一对service => provider
$this->register($instance = new $provider($this));
2.1.1 register
if (($registered = $this->getProvider($provider)) && ! $force) {
return $registered;
}
如果是非强制注册且此provider
已经注册过,那么直接返回
if (is_string($provider)) {
$provider = $this->resolveProviderClass($provider);
}
这里的 resolveProviderClass()方法,只有一行代码 return new $provider($this);
,将$this实例传入provider
,作用未知。回到register()
$provider->register();
调用provider
自身的register()
$this->markAsRegistered($provider);
此处会注册$this->serviceProviders
和$this->loadedProviders
数组,