浅析laravel路由执行原理

Posted 1994july

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了浅析laravel路由执行原理相关的知识,希望对你有一定的参考价值。

包头SEO:目前很多文章已经对Laravel的执行原理做了详细介绍,这里只是为了个人做一下简单记录

首先看入口 index.php

技术图片

关键的执行函数就是 handle方法 ,但是前面的几个预处理函数,包括了整合框架的大知识点。

进入

require_once __DIR__.‘/../bootstrap/app.php‘;

发现 $app初始化了Application对象

$app = new IlluminateFoundationApplication(
    $_ENV[‘APP_BASE_PATH‘] ?? dirname(__DIR__)
);

紧接着有一个关键操作 singleton

$app->singleton(
    IlluminateContractsHttpKernel::class,
    AppHttpKernel::class
);

$app->singleton(
    IlluminateContractsConsoleKernel::class,
    AppConsoleKernel::class
);

$app->singleton(
    IlluminateContractsDebugExceptionHandler::class,
    AppExceptionsHandler::class
);

 

这里的单例,将抽象类绑定给了实体类

包括后面 index.php 里面马上在make方法中用到的

技术图片

因此$kernel 得到的是 AppHttpKernel::class 的实例对象。

继续看后面

$kernel执行handle

AppHttpKernel::class 继承了 

IlluminateFoundationHttpKernel

因此执行的是

技术图片

我们关键留意 

sendRequestThroughRouter 方法

技术图片

这里的首先将 $request 注册到公共容器中

through 方法会将原本定义在 AppHttpKernel::class 里面的 中间件
protected $middleware = [
    AppHttpMiddlewareCheckForMaintenanceMode::class,
    IlluminateFoundationHttpMiddlewareValidatePostSize::class,
    AppHttpMiddlewareTrimStrings::class,
    IlluminateFoundationHttpMiddlewareConvertEmptyStringsToNull::class,
    AppHttpMiddlewareTrustProxies::class,
    //AppHttpMiddlewareApiV1StatisticsCommonCommonStatisticsMiddleware::class
];

 

成员变量注入到管道中,

->through($this->app->shouldSkipMiddleware() ? [] : $this->middleware)

通过array_reduce 方法会依次将中间件中handle方法执行

最后执行 $this->dispatchToRouter();

可能有些朋友不解了

技术图片

按照array_reduce方法不是将 

$this->prepareDestination($destination)

首先执行吗,这个也的确没毛病,关键是这个prepareDestination 只是作为一个预加载的作用,执行后返回的是一个后调函数,回调函数里面才是我们前面提到的$this->dispatchToRouter() , 因此它会被注入到管道的最底部,将倒序之后的中间件执行注入之后,最后得到的就是 首个中间件的 

Closure 闭包方法。

技术图片

最后一步,将这个闭包执行,就可以依次执行中间件的验证,和dispatchToRouter方法了

以上是关于浅析laravel路由执行原理的主要内容,如果未能解决你的问题,请参考以下文章

laravel5.5学习2-路由系统

浅析JVM是如何处理异常的?finally块必须执行的原理?

浅析JVM是如何处理异常的?finally块必须执行的原理?

浅析JVM是如何处理异常的?finally块必须执行的原理?

Laravel 8 视图不更新路由

webpack系列--浅析webpack的原理