资讯专栏INFORMATION COLUMN

Laravel kernel实例化

meteor199 / 1971人阅读

摘要:实例化实例化在应用进行实例化时,已经初始化了很多的基础操作,所以下面的构造方法将会直接使用服务容器的依赖注入来解决类之间的依赖关系。返回一个对象,同时会重置对象,供下次直接调用。

Laravel Kernel实例化
$kernel = $app->make(IlluminateContractsHttpKernel::class);
实例化 Kernel

在应用进行实例化时,已经初始化了很多的基础操作,所以下面的构造方法将会直接使用服务容器的依赖注入来解决类之间的依赖关系。

// IlluminateContractsHttpKernel 类构造器依赖 IlluminateContractsFoundationApplication 和 IlluminateRoutingRouter,将会通过服务容器来处理依赖关系
public function __construct(Application $app, Router $router)
{
    $this->app = $app;

    // 主要委托 $router 来处理
    $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);
    }
}

IlluminateContractsFoundationApplication 的处理:
make 时通过别名方式直接调用 $this->instances["app"]

IlluminateRoutingRouter 的处理:
make 时通过别名方式直接调用 $this->bindings["router"] 数组里面 concrete 对应的匿名函数
Router 依赖 IlluminateContractsEventsDispatcher 和 IlluminateContainerContainer
public function __construct(Dispatcher $events, Container $container = null)
{
    $this->events = $events;
    $this->routes = new RouteCollection;
    $this->container = $container ?: new Container;
}

IlluminateContractsEventsDispatcher 的处理:
make 时通过别名方式直接调用 $this->bindings["events"] 数组里面 concrete 对应的匿名函数
Dispatcher 依赖 IlluminateContractsContainerContainer
public function __construct(ContainerContract $container = null)
{
    $this->container = $container ?: new Container;
}

IlluminateContainerContainer 的处理:
make 时直接调用 $this->instances["IlluminateContainerContainer"] = Object(app)
IlluminateContractsContainerContainer 的处理:
make 时调用别名直接调用 $this->instances["app"] = Object(app)
上面两个一样,没有区别

注意:以上所列出的依赖关系,都直接委托给服务容器进行自动处理了,不需要怕怕

对 $this->bindings["router"] 和 $this->bindings["events"] 绑定事件的处理,make 时将会直接调用数组键 concrete 对应的匿名函数。

make 时使用到的代码片段

##############################################
if ($concrete instanceof Closure) {            
    return $concrete($this, end($this->with)); 
}
###############################################

$this->bindings["router"] = [
        "concrete" => function ($app) {
                            return new Router($app["events"], $app);
                        },
        "shared" => "true",
    ];
$router = new Router($app["events"], $app);

IlluminateRoutingRouter
public function __construct(Dispatcher $events, Container $container = null)
{
    $this->events = $events;
    $this->routes = new RouteCollection;
    $this->container = $container ?: new Container;
}

返回一个 Router 对象,同时会重置 $this->instances["router"] = $router 对象,供下次直接调用。

$this->bindings["events"] = [
    "concrete" => function ($app) {
            return (new Dispatcher($app))->setQueueResolver(function () use ($app) {
                return $app->make(QueueFactoryContract::class);
            });
            }
    "shared" => "true",
];

$dispatcher = (new IlluminateEventsDispatcher($app))->setQueueResolver(function () use ($app) {
                return $app->make(QueueFactoryContract::class);
            });

IlluminateEventsDispatcher:
public function __construct(ContainerContract $container = null)
{
    $this->container = $container ?: new Container;
}
public function setQueueResolver(callable $resolver)
{
    $this->queueResolver = $resolver;

    return $this;
}

返回一个 Dispatcher 对象,同时会重置 $this->instances["events"] = $dispatcher 对象,供下次直接调用。

注意:
kernel对象是融合了应用和路由的对象,路由又注入了IlluminateEventsDispatcher对象,此为核心对象。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/22611.html

相关文章

  • Laravel 动态添加 Artisan 命令的最佳实践

    摘要:初步尝试既然最常见的注册命令的方式是修改类中的,那么一般正常人都会从这边开始下手。又要自己取出实例,又要自己调用方法,调用方法之前还有自己先把实例化这么繁琐,肯定不是运行时添加命令的最佳实践,所以我决定继续寻找更优解。 本文首发于我的博客,原文链接:https://blessing.studio/best-... 虽然 Laravel 官方文档提供的添加 Artisan Command...

    ninefive 评论0 收藏0
  • Laravel 请求周期

    摘要:请求周期加载自动加载器获取应用对象实例化应用解析此对象贯穿全文主要过程设置基础路径基础绑定注册全局基础服务核心容器别名设置注册三个单例获取对象实例化此对象为应用的枢纽,将会协调各部分之间的工作,完成请求主要过程注入应用对象注入事件对象注入 Laravel 请求周期 加载 composer 自动加载器 require __DIR__./../bootstrap/autoload.php;...

    Cristalven 评论0 收藏0
  • Laravel源码解析之反射的使用

    摘要:本章讲解反射类的使用及对反射的使用。各位很清楚,方法用于解析类,所有方法的实现一定是在引用的文件内。致谢感谢你看到这里,本篇文章源码解析靠个人理解。 showImg(https://segmentfault.com/img/bVbhjvY?w=600&h=296); 前言 PHP的反射类与实例化对象作用相反,实例化是调用封装类中的方法、成员,而反射类则是拆封类中的所有方法、成员变量,并...

    pinecone 评论0 收藏0
  • Laravel学习:请求到响应的生命周期

    摘要:请求处理阶段请求处理阶段首先是准备请求处理的环境,包括环境加载服务提供者注册等环节,然后将请求实例通过中间件处理及通过路由和控制器的分发控制,使得不同的请求通过相应的处理程序进行处理并生成响应的过程。 Laravel请求到响应的整个执行过程,主要可以归纳为四个阶段,即程序启动准备阶段、请求实例化阶段、请求处理阶段、响应发送和程序终止阶段。 程序启动准备阶段 服务容器实例化 服务容器的实...

    OBKoro1 评论0 收藏0
  • Laravel 启动流程

    摘要:年月日阶段划分请求到响应的整个执行阶段归纳为个程序启动准备阶段文件自动加载服务容器实例化基础服务提供者的注册核心类的实例化请求实例化阶段实例化实例请求处理阶段准备请求处理的环境将请求实例通过中间件处理及通过路由和控制器的分发控制响应发送和 Last-Modified: 2019年5月10日16:19:07 阶段划分 Laravel 5.5请求到响应的整个执行阶段归纳为 4 个: ...

    VPointer 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<