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
相关推荐
码农水水14 分钟前
大疆Java面试被问:TCC事务的悬挂、空回滚问题解决方案
java·开发语言·人工智能·面试·职场和发展·单元测试·php
do better myself2 小时前
php 使用IP2Location限制指定的国家访问实现
开发语言·php
用户14644605033794 小时前
PHP 多维数组处理利器:array_column() 用法详解
php·thinkphp
郑州光合科技余经理6 小时前
架构解析:同城本地生活服务o2o平台海外版
大数据·开发语言·前端·人工智能·架构·php·生活
智能修复7 小时前
502 Bad Gateway:互联网世界的“断桥”时刻
开发语言·php
源码师傅7 小时前
AI短剧创作系统源码 开发语言:PHP+MySQL 基于uniapp 无限SAAS多开源码
人工智能·php·短剧小程序开发·ai短剧创作系统源码·ai短剧创作系统·短剧原创制作软件
BingoGo7 小时前
PHP 8.5 #[\NoDiscard] 揪出"忽略返回值"的 Bug
后端·php
星辰烈龙1 天前
黑马程序员JavaSE基础加强d5
服务器·网络·php
No0d1es1 天前
2025年12月 GESP CCF编程能力等级认证Python三级真题
开发语言·php
哥只是传说中的小白1 天前
Nano Banana Pro高并发接入Grsai Api实战!0.09/张无限批量生成(附接入实战+开源工具)
开发语言·数据库·ai作画·开源·aigc·php·api