laravel启动流程

laravel启动流程

  1. nginx/apache路由到public/index.php文件
  2. 加载/vendor/autoload.php composer包管理器文件
  3. $app = require_once DIR.'/../bootstrap/app.php'; 得到ioc容器
    • 实例化Illuminate\Foundation\Application 运行构造函数
      • setBasePath 绑定路径变量
      • registerBaseBindings 注册基础绑定到容器(初始化容器)
      • registerBaseServiceProviders 注册基础服务到容器(事件,日志,路由服务)
      • registerCoreContainerAliases 核心容器设置别名
    • Illuminate\Foundation\Application->singleton() 将App\Http\Kernel,App\Console\Kernel,App\Exceptions\Handler三个核心类注册到容器(此处需要了解bind方法
  4. $kernel = $app->make(Illuminate\Contracts\Http\Kernel:Class); $kernel为Illuminate\Foundation\Http\Kernel 实例化对象
    • 从binding的数组里面找出Illuminate\Contracts\Http\Kernel:Class绑定的信息(闭包定义的是接口和实现类调用build方法)
    • 从容器中获取Illuminate\Contracts\Http\Kernel:Class注册的闭包
    • build方法执行闭包,闭包里调用build方法,然后通过反射加递归的方式获取Illuminate\Contracts\Http\Kernel:Class的实例化对象,bindings属性包含注册的绑定关系,instances属性包含已实例化对象
  5. $kernel->handle($request = Request::capture())
    • $request = Request::capture() 将http请求的信息存到requset对象
    • $kernel->bootstrap();启动服务,分别执行以下几个类的bootstrap方法
      • LoadEnvironmentVariables 加载环境变量
      • LoadConfiguration 加载配置文件,将配置文件赋值到对应环境变量上
      • HandleExceptions 异常处理
      • RegisterFacades 注册外观类,spl_autoload_register()将外观类注册到栈顶,app.aliases设置的外观类:(eg:执行Router:get(),找不到的类通过sql_autoload_register注册找到Facade.php 触发魔术方法__callStatic获取到app.aliases的Route对应的Illuminate\Support\Facades\Route::class路由外观类,路由外观类会获取关键字route,从容器中获取router实例化对象)
      • RegisterProviders 注册app.providers所有的服务类,将所有非延迟加载的服务类注册
      • BootProviders 执行serviceProvice的boot方法
    • (new Pipeline($this->app))->send($request)->through($this->app->shouldSkipMiddleware() ? [] : $this->middleware)->then($this->dispatchToRouter());请求通过中间件

(未完...)##

posted @ 2020-12-14 11:18  Master-lcf  阅读(276)  评论(0)    收藏  举报