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,如下,在服务提供者中已经注册了三个

image
其中Http/Kernel 就是为了后面处理http请求的核心类,这个在下一篇细细道来。

有什么不对或有疑问的地方请大佬们指正:)

本作品采用《CC 协议》,转载必须注明作者和本文链接
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!