在\bootstrap\app.php文件中:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | $app ->singleton( Illuminate\Contracts\Http\Kernel:: class , App\Http\Kernel:: class ); $app ->singleton( Illuminate\Contracts\Console\Kernel:: class , App\Console\Kernel:: class ); $app ->singleton( Illuminate\Contracts\Debug\ExceptionHandler:: class , App\Exceptions\Handler:: class ); |
App\Http\Kernel::class(中间件)
1 2 3 4 5 6 7 | protected $middleware = [ \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode:: class , \Illuminate\Foundation\Http\Middleware\ValidatePostSize:: class , \App\Http\Middleware\TrimStrings:: class , \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull:: class , \App\Http\Middleware\TrustProxies:: class , ]; |
\vendor\laravel\framework\src\Illuminate\Foundation\Http\Kernel.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | protected function sendRequestThroughRouter( $request ) { $this ->app->instance( 'request' , $request ); Facade::clearResolvedInstance( 'request' ); //针对请求为应用程序'拔靴带' 执行bootstrap类的数组 //在请求处理阶段共有7个环节,每一个环节由一个类来实现的 //而且每个类都会有一个bootstrap()函数用于实现准备工作 $this ->bootstrap(); return ( new Pipeline( $this ->app)) ->send( $request ) ->through( $this ->app->shouldSkipMiddleware() ? [] : $this ->middleware) ->then( $this ->dispatchToRouter()); } |
1 2 3 4 5 6 7 8 9 10 11 12 13 | /** * Get the route dispatcher callback. *设置路由分发回调函数 * @return \Closure */ protected function dispatchToRouter() { return function ( $request ) { $this ->app->instance( 'request' , $request ); return $this ->router->dispatch( $request ); }; } |
\vendor\laravel\framework\src\Illuminate\Pipeline\Pipeline.php
1 2 3 4 5 6 7 8 9 10 11 12 | /** * Set the object being sent through the pipeline. *设置被送入管道的对象 * @param mixed $passable * @return $this */ public function send( $passable ) { $this ->passable = $passable ; return $this ; } |
1 2 3 4 5 6 7 8 9 10 11 12 | /** * Set the array of pipes. *设置导管数组 * @param array|mixed $pipes * @return $this */ public function through( $pipes ) { $this ->pipes = is_array ( $pipes ) ? $pipes : func_get_args(); return $this ; } |
1 2 3 4 5 6 7 8 9 10 11 | /** * 以一个回调函数为终点执行管道处理 */ public function then(Closure $destination ) { $pipeline = array_reduce ( array_reverse ( $this ->pipes), $this ->carry(), $this ->prepareDestination( $destination ) ); return $pipeline ( $this ->passable); } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | /** * 获取一个用来代替洋葱层的回调函数 * * @return \Closure */ protected function carry() { return function ( $stack , $pipe ) { return function ( $passable ) use ( $stack , $pipe ) { if ( is_callable ( $pipe )) { return $pipe ( $passable , $stack ); } elseif (! is_object ( $pipe )) { list( $name , $parameters ) = $this ->parsePipeString( $pipe ); $pipe = $this ->getContainer()->make( $name ); $parameters = array_merge ([ $passable , $stack ], $parameters ); } else { $parameters = [ $passable , $stack ]; } return method_exists( $pipe , $this ->method) ? $pipe ->{ $this ->method}(... $parameters ) : $pipe (... $parameters ); }; }; } |
在 Laravel 框架中,很多注释和代码名称已经非常形象地表达了程序代码的功能,代码注释中将中间件称为“洋葱”层,将整个处理流程称为“管道”,有些地方会用到这些名词,如果读者理解了真正的含义就会更容易理解程序。对清求的处理阶段, l1 ’先对管道类( Pipelinc 类)进行了实例化,分别通过 send ( )函数和 through ( )函数将请求实例和中间件数组赋值给管道实例,而鼓终的处理是通过 theno 函数完成的,该函数有一个参数,这个参数是经过“管道”后的终点处理函数,即下~步的路由处理。而 theno 函数其实就是将整个中间件数组通过服务容器’仁成实例,并对这些实例的 handlco 函数和传入的终点处理 l " l 调函数进行组装,形成一个递归调用的回调函数,再进行调用,最终完成“管道”的逐级处理
本文来自博客园,作者:孙龙-程序员,转载请注明原文链接:https://www.cnblogs.com/sunlong88/p/9361633.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· DeepSeek在M芯片Mac上本地化部署
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能