博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
laravel中间件
阅读量:5214 次
发布时间:2019-06-14

本文共 3709 字,大约阅读时间需要 12 分钟。

在\bootstrap\app.php文件中:

$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(中间件)

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

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());    }

 

/**     * 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

/**     * Set the object being sent through the pipeline.     *设置被送入管道的对象     * @param  mixed  $passable     * @return $this     */    public function send($passable)    {        $this->passable = $passable;        return $this;    }

  

/**     * 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;    }

  

/**     * 以一个回调函数为终点执行管道处理     */    public function then(Closure $destination)    {        $pipeline = array_reduce(            array_reverse($this->pipes), $this->carry(), $this->prepareDestination($destination)        );        return $pipeline($this->passable);    }

  

/**     * 获取一个用来代替洋葱层的回调函数     *     * @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

你可能感兴趣的文章
uva 10137 The trip
查看>>
spring 解决中文乱码问题
查看>>
hdu 4268
查看>>
启动tomcat时cmd窗口一闪而过
查看>>
两个有序数列,求中间值 Median of Two Sorted Arrays
查看>>
vue路由的实现原理
查看>>
Java核心技术:Java异常处理
查看>>
Python 学习笔记一
查看>>
引入列表,将对话分类添加到对应列表中
查看>>
回文子串
查看>>
Count Numbers
查看>>
React——JSX
查看>>
编写高质量代码改善C#程序的157个建议——建议110:用类来代替enum
查看>>
最大公约数求解
查看>>
网卡bond技术
查看>>
UITabbarController的UITabbarItem(例:"我的")点击时,判断是否登录
查看>>
机器学习之支持向量机(一):支持向量机的公式推导
查看>>
对【SQL SERVER 分布式事务解决方案】的心得补充
查看>>
UNIX基础知识之输入和输出
查看>>
【洛谷 P1666】 前缀单词 (Trie)
查看>>