laravel(源码笔记)服务提供者执行过程

服务提供者

  1. 自定义服务,第三方资源,核心服务,通过服务提供者进行注册和引导。
  2. 基本
    1. register,绑定实例,注册到服务容器
    2. provides,导出provide实例
  3. 实例化app,解析处kernel对象,引导bootstrap(重点),kernel处理请求,进入中间件,最后返送请求给路由毒药的控制器方法
    1. 检查环境
    2. 加载应用配置
    3. 配置日志
    4. 注册异常处理回调
    5. 注册Facades
    6. 注册Providers
    7. 启动Providers
  4. providers
    1. $kernel->handle
    2. sendRequestThroughRouter
      1. bootstrap(v)
      2. send
      3. middleware 是否跳过
      4. dispatchToRouter
    3. bootstrapWith
    4. t h i s − > m a k e ( this->make( this−>make(bootstrapper)->bootstrap($this);
    5. RegisterProviders bootstrap
    6. Application registerConfiguredProviders
    7. getCachedServicesPath $this->bootstrapPath().'/cache/services.php' 生成服务文件
    8. ProviderRepository load
      1. loadManifest()会加载服务提供器缓存文件services.php
      2. shouldRecompile 缓存的service.php文件里面的providers和config.php/app.php内的providers不一致就会导致重新编译
      3. compileManifest
        1. freshManifest
        2. 创建provider实例
        3. 是否延迟加载
          1. 是,将实例作为键,提供者作为值存入缓存文件的deferred数组中。有事件则入栈到事件when数组中
          2. 否,直接入栈eager数组
        4. 将$manifest写入缓存文件
      4. 事件触发时注册延迟服务提供器 registerLoadEvents t h i s − > a p p − > m a k e ( ′ e v e n t s ′ ) − > l i s t e n ( this->app->make('events')->listen( this−>app−>make(′events′)−>listen(events, registerProviderActionClosure)
      5. 即时注册服务提供器 register
        1. 非强制,获取提供者返回(已经注册过)
        2. 字符串,解析提供者
        3. 对象,存在register方法,执行register
        4. 标记提供者已经注册,入栈服务提供者数组,设置该提供者已经注册完毕
        5. 是否需要引导,需要则启动引导,执行provider的boot
        6. 返回提供者
      6. 服务解析时注册延迟服务提供器 addDeferredServices
    9. app make 过程。
      1. 是否在 deferredServices,是则 loadDeferredProvider
        1. loadDeferredProvider 是否已经加载过,没有则注册
          1. registerDeferredProvider
            1. 删除 deferredServices 对应的provider
            2. 框架还未启动,放入等待启动的回调函数中,等待服务启动时调用。
    10. 启动application
      1. BootProviders
        1. 执行启动前hook
        2. bootProvider 执行boot
        3. 标记已经启动
        4. 执行启动后hook
相关推荐
ServBay1 天前
告别面条代码,PSL 5.0 重构 PHP 性能与安全天花板
后端·php
多厘2 天前
别再手写 psr-4 了!用 Composer 隐藏魔法干掉上千行烂配置
laravel
JaguarJack3 天前
FrankenPHP 原生支持 Windows 了
后端·php·服务端
BingoGo3 天前
FrankenPHP 原生支持 Windows 了
后端·php
JaguarJack4 天前
PHP 的异步编程 该怎么选择
后端·php·服务端
BingoGo4 天前
PHP 的异步编程 该怎么选择
后端·php
JaguarJack5 天前
为什么 PHP 闭包要加 static?
后端·php·服务端
ServBay6 天前
垃圾堆里编码?真的不要怪 PHP 不行
后端·php
用户962377954486 天前
CTF 伪协议
php
BingoGo8 天前
当你的 PHP 应用的 API 没有限流时会发生什么?
后端·php