经过一系列测试,最终发现,是构造函数和中间件的执行顺序有问题:
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');
}
}
最终呈现结果