Laravel源码进阶
- 版本 laravel5.8
生成服务容器
- public index.php
//compose必要操作
require __DIR__.'/../vendor/autoload.php';
//容器文件
$app = require_once __DIR__.'/../bootstrap/app.php';
-bootstrap/app.php
//初始化容器 构造函数中执行这个几个方法
//$this->registerBaseBindings();
// $this->registerBaseServiceProviders();
//$this->registerCoreContainerAliases();
$app = new Illuminate\Foundation\Application(
$_ENV['APP_BASE_PATH'] ?? dirname(__DIR__)
);
$app->singleton(
Illuminate\Contracts\Http\Kernel::class,
App\Http\Kernel::class
);
$app->singleton(
Illuminate\Contracts\Console\Kernel::class,
App\Console\Kernel::class
);
$app->singleton(
Illuminate\Contracts\Debug\ExceptionHandler::class,
App\Exceptions\Handler::class
);
return $app;
- 首先加载autoload文件 -> 先new app(就是application 初始化instance方法初始化instance属性 然后registrProvider 使用的是观察者模式 然后传入对象就是会执行register方法 这就是为什么需要register方法 绑定bindings属性 ) singleton就是绑定在bindings属性上
singleton就是有三种方式调用方式
- make方法的实现
$kernel = $app->make(Illuminate\Contracts\Http\Kernel::class);
获取实例化对象 - serviceProvider 分析
第一种laravel的依赖注入去绑定服务者
第二种就是自己去创建依赖关系
bind是绑定
在路由中使用app(“Family”)就是可以解析 - 加载并启动laravelProvider(进入request请求了)(封装用户请求) 加载环境变量 加载配置 加载异常 加载Facades 加载服务提供者
new static() 延迟加载 - 封装用户请求 -> 穿过路由和中间件->封装一系列的服务
- register 用户绑定服务到容器, 先调用provider的register方法,等所有服务都注册完毕再去调用每一个服务的boot方法 register是必须的,boot方法不是必须的
- 服务提供者延时注册
- 事件:观察者模式 用来解耦非常的完美
- 中间件:管道模式,用户请求经过一层一层的中间件,然后执行用户处理逻辑,先走全局,然后web,然后自己的中间件
总结
- 实现依赖注入,更好的管理类之间的依赖关系,为扩展提供无线的可能,实现了一些高级特性
- 缺点:加载文件太多,导致速度变慢
- 声明周期 包含自动加载文件-> 注册基础的bindings -> 注册进出的servicePeovider 只是最基础的-> 绑定重要的接口 ->获取request对象 -> 业务逻辑处理 (加载基本的启动项,路由,异常处理,通过管道模式使用中间件处理业务) -> 返回response
- 常用的模式 单例模式,观察