如何理解laravel的服务加载流程
加载流程
所有的解读都将以注释的方式出现。
文件流程
- public/index.php
- bootstrap/app.php
- app/Http/Kernel.php
- src/Illuminate/Foundation/Http/Kernel.php
- src/Illuminate/Foundation/Bootstrap/RegisterProviders.php
- src/Illuminate/Foundation/Bootstrap/BootProviders.php
- src/Illuminate/Foundation/Application.php
代码流程
public/index.php
web入口文件,console入口是
./artisan
bootstrap/app.php
框架引导文件
app/Http/Kernel.php
http内核,console内核在`app/Console/Kernel.php
src/Illuminate/Foundation/Http/Kernel.php
接下来会通过分段来分析这个文件的代码
src/Illuminate/Foundation/Bootstrap/RegisterProviders.php
引导注册服务
src/Illuminate/Foundation/Bootstrap/BootProviders.php
按需启动服务
src/Illuminate/Foundation/Application.php
应用容器,实例装载器。符合psr11
src/Illuminate/Foundation/ProviderRepository.php
最后再来看看服务仓库是如何将服务注册到容器中去的
服务挖掘
这个功能得益于post-autoload-dump事件,composer会在依赖安装完成后执行一个叫做
@php artisan package:discover --ansi
的命令,去查找是否有laravel相关的服务需要注册,如果有那就把服务信息记录在bootstrap/cache/services.php
如果不依赖post-autoload-dump事件,如何找到依赖所要引入的服务?
发布资源
命令
php artisan vendor:publish --provider="..."
会将ServiceProvider::$publishes
队列中的文件/文件夹复制到映射目录,--tag
选项是指定发布分组资源。laravel-admin例子:
php artisan vendor:publish --tag="laravel-admin-config"
,这样就只发布配置文件到正式目录。参阅:
\Illuminate\Foundation\Console\VendorPublishCommand::publishTag()
\Illuminate\Support\ServiceProvider::pathsToPublish()