生命周期 2--kernel 对象解析过程浅析

首先,$app 已经创建完成,初始化工作也已经完成(具体步骤就不废话了)#

  • public/index.php
    $app = require_once __DIR__.'/../bootstrap/app.php';

创建 kernel 对象#

$kernel = $app->make(Illuminate\Contracts\Http\Kernel::class);
  • 首先解析 Illuminate\Contracts\Http\Kernel::class,返回其绑定时声明的闭包(由于绑定的时候是绑定的字符串,因此,这个闭包是 \Illuminate\Container\Container::getClosure 返回的。实际上,就是去 $app->make ('App\Http\Kernel::class')。
  • 解析 App\Http\Kernel::class。由于没有绑定过它,因此是直接利用反射机制去生成对象。在生成对象的过程中,会去实例化反射对象的参数,如果参数生成的对象的构造函数中还有其他的类参数,那么就会递归的去实例化(这就是依赖注入的好处,否则光是写 new 就得累死)。过程就是:

    • new \Illuminate\Foundation\Http\Kernel

      public function __construct(Application $app, Router $router)
      {
          $this->app = $app;
          $this->router = $router;
      
          $router->middlewarePriority = $this->middlewarePriority;
      
          foreach ($this->middlewareGroups as $key => $middleware) {
              $router->middlewareGroup($key, $middleware);
          }
      
          foreach ($this->routeMiddleware as $key => $middleware) {
              $router->aliasMiddleware($key, $middleware);
          }
      }
    • new \Illuminate\Routing\Router
      public function __construct(Dispatcher $events, Container $container = null)
      {
          $this->events = $events;
          $this->routes = new RouteCollection;
          $this->container = $container ?: new Container;
      }
  • 也就是说在这个 Illuminate\Contracts\Http\Kernel 解析过程中,实际上递归的解析了 events, router, App\Http\Kernel,最后返回的是一个 App\Http\Kernel 对象到 $kernel 变量中。
本作品采用《CC 协议》,转载必须注明作者和本文链接
日拱一卒
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
未填写
文章
92
粉丝
87
喜欢
152
收藏
121
排名:73
访问:11.3 万
私信
所有博文
社区赞助商