Laravel 源码学习笔记 2:App 容器的实例化
上一篇文章,简述了请求的简单流程,这篇开始介绍app容器实例化过程。
话不多说,进入index.php
$app = require_once __DIR__.'/../bootstrap/app.php';
打开bootstrap/app.php
$app = new Illuminate\Foundation\Application(
realpath(__DIR__.'/../')
);
继续打开Illuminate\Foundation\Application
进入到Application.php的构造方法,构造方法中做了几件事情
public function __construct($basePath = null)
{
if ($basePath) {
$this->setBasePath($basePath);
}
//注册基本绑定
$this->registerBaseBindings();
//注册基本的服务提供者
$this->registerBaseServiceProviders();
//注册基本绑定
$this->registerCoreContainerAliases();
}
这里我们主要看下第二个注册基本的服务提供者 $this->registerBaseServiceProviders();
protected function registerBaseServiceProviders()
{
//这里,主要是往容器中注册了三个服务,并且各自的服务会往容器的bindings添加绑定
//注册了事件服务
$this->register(new EventServiceProvider($this));
//注册日志服务
$this->register(new LogServiceProvider($this));
//注册路由服务
$this->register(new RoutingServiceProvider($this));
}
那现在可能会好奇,到底这个register是干了啥,所以我们看下EventServiceProvider这个
class EventServiceProvider extends ServiceProvider
{
/**
* Register the service provider.
*
* @return void
*/
public function register()
{
//单例绑定
$this->app->singleton('events', function ($app) {
return (new Dispatcher($app))->setQueueResolver(function () use ($app) {
return $app->make(QueueFactoryContract::class);
});
});
}
}
执行EventServiceProvider 里的register方法,单例绑定events和他的实现;点进Dispatcher会发现,其实这个类就是事件及监听的主要实现类,有兴趣的可以看看里面的方法,事件监听也是观察者模式的一个体现。
至此,APP容器的初始化就创建完成了,通过构造函数可以看到,主要是注册了一些基础服务,所以容器,其实就是存放接口和实现类的绑定的地方,管理服务提供者和他们的实现类的绑定,所以这就是文档中的概念:管理类的依赖和实现依赖注入的工具。管理的就是服务和实现类的绑定,也就是依赖。
我们可以打印一下初始化后的app,如下,在服务提供者中已经注册了三个
其中Http/Kernel 就是为了后面处理http请求的核心类,这个在下一篇细细道来。
有什么不对或有疑问的地方请大佬们指正:)
本作品采用《CC 协议》,转载必须注明作者和本文链接