Illuminate\Foundation\Application
写194-源码分析的时候感觉有点费劲,想了想构造方法没看就直接看
make()
了,这节把构造方法补上这次从
_construct()
说起
1. registerBaseBindings()
static::setInstance($this);
讲自身实例赋值给static::$instance
$this->instance('app', $this);
1.1 instance()
if (is_array($abstract)) {
// $abstract 是这样的一个数组 ['actual key' => 'alias']
list($abstract, $alias) = $this->extractAlias($abstract);
$this->alias($abstract, $alias);
}
此处使用`list`将extractAlias()
返回的数组中的每个域依次赋值给list中的变量,调用alias()
注册到$this->aliases
$bound = $this->bound($abstract);
bound()
中的写法很好玩
return isset($this->bindings[$abstract]) || isset($this->instances[$abstract]);
instance()
方法中最核心的就是下面这一行
$this->instances[$abstract] = $instance;
将传入的$instance
放入container
的instances
属性中,并以$abstract
作为key值,从此这个$instance
可以在容器中共享
2. registerBaseServiceProviders( )
$this->register(new EventServiceProvider($this));
$this->register(new RoutingServiceProvider($this));
此处调用了register()
方法,主要逻辑是调用每个provider自身的register()
,
这些provider都有一个共同的父类 Illuminate\Support\ServiceProvider
Illuminate\Events\EventServiceProvider的register()
$this->app->singleton('events', function ($app) {
return (new Dispatcher($app))->setQueueResolver(function () use ($app) {
return $app->make('Illuminate\Contracts\Queue\Factory');
});
});
上面的代码将一个 Illuminate\Events\Dispatcher
对象以键 events 绑定到了容器 中,它负责实现事件的调度。
Illuminate\Routing\RoutingServiceProvider 的register()
$this->registerRouter();
$this->registerUrlGenerator();
$this->registerRedirector();
$this->registerPsrRequest();
$this->registerPsrResponse();
$this->registerResponseFactory();
route 被注册,它是 Illuminate\Routing\Router
对象。
3.registerCoreContainerAliases()
将核心组件注册到container中,如app,cache,blade等