生命周期 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 协议》,转载必须注明作者和本文链接
日拱一卒
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
讨论数量: 2

生命周期 1 没了么?

6年前 评论

大佬生命周期1在哪里?@hustnzj

6年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!
未填写
文章
92
粉丝
87
喜欢
152
收藏
121
排名:72
访问:11.3 万
私信
所有博文
社区赞助商