浅析laravel路由执行原理
目前很多文章已经对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路由执行原理 的全部内容, 来源链接: utcz.com/z/511617.html