laravel 中间件与构造函数的详解

版权声明:版权归qq175023117所有 https://blog.csdn.net/qq175023117/article/details/86588985

经过一系列测试,最终发现,是构造函数和中间件的执行顺序有问题:

1.先执行构造函数

2.再调用中间件

什么是中间件?

对于一个Web应用来说,在一个请求真正处理前,我们可能会对请求做各种各样的判断,然后才可以让它继续传递到更深层次中。而如果我们用if else这样子来,一旦需要判断的条件越来越来,会使得代码更加难以维护,系统间的耦合会增加,而中间件就可以解决这个问题。我们可以把这些判断独立出来做成中间件,可以很方便的过滤请求。

中间件代码分析

中间件可以实现啊很多功能,例如权限验证,访问记录,重定向等等。

具体干什么看自己想法。

中间件在请求阶段会调用自己的handle()方法
同时中间件也可以在响应阶段使用,这时,会掉用它的terminate()方法。
所以,当需要在响应发出后使用中间件只需要重写terminate()方法即可。

<?php

namespace App\Http\Middleware;

use Closure;

class TestMiddleware
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        return $next($request);
    }
    public function terminate($request, $response)
    {
        //这里是响应后调用的方法
    }
}

handle()方法

handle()方法有两个参数
$request --->请求信息,里面包含了输入,URL,上传文件等等信息。
$next --->闭包函数。我的理解是将接下来需要执行的逻辑装载到了其中。

返回值:
通过上文对参数的描述可以了解到:
当我们在中间件中return $next($request);时,相当与把请求传入接下来的逻辑中。
同时,中间件也可以返回重定向,不运行之前的逻辑。
例如,希望将页面重定向到'/welcome'的页面return redirect('welcome').
注意,这里是重定向到"/welcome"这个地址的route而不是"welcome"这个页面(view)。

terminate()方法

参数
$request --->请求信息,里面包含了输入,URL,上传文件等等信息。
$response -->响应消息,包含了逻辑处理完成后传出到的响应消息。

因为terminate()方法只是在响应后进行一些处理所以没有返回值。

我在项目中创建了一个中间件,然后发现中间件在控制器构造方法执行完后才调用了,然后重新建了个项目试了下。

class Test
{

    public function handle($request, Closure $next)
    {
        dump('a');
        return $next($request);
    }
}   

控制器

class TestController extends Controller
{
  public function __construct()
  {
    dump('b');
  }

  public function index()
  {
    dump('c');
  }
}

最终呈现结果 

猜你喜欢

转载自blog.csdn.net/qq175023117/article/details/86588985
今日推荐