Lumen,中间件间、中间件与控制器间传值的方式

Lumen版本:5.3 ,更多Lumen笔记:Lumen学习笔记

Lumen的中间件(Middleware)相当于一些框架的过滤器(Filter),其作用就是在路由指派到指定控制器(Controller)之前,或者在控制器初始化时,对请求(Request)进行预处理

Lumen的中间件可以在路由中定义,也可以在控制器初始化时定义,这里不多说了


情境

最常用的中间件莫过于权限验证(Auth),在我的工程中有以下代码:

$this->middleware('auth');
$this->middleware('enable', ['only' => [
  'selfinfo'
]]);

该控制器所有方法都需要通过有身份的验证,其中selfinfo方法额外需要验证用户的特殊可用性。

  • 若中间件间若没有参数的传递,将重复执行获取身份的操作
  • 若中间件与控制器间没有参数的传递,控制器中若需要获取身份,将还要重复一次

解决

首先想到的是cookiesession,可是但5.2开始Lumen移除了支持,需要Laravel才有。这里很容易理解,因为Lumen是简单框架,作为与Laravel的最主要区分,便是访问的单次属性,变量的存储应该是在访问情况结束时便结束,所以Request才是关键。

官方在Request提供了一个属性对象attributes来实现参数的传递,理解它,便能让变量伴随此次访问对象$request到本次访问结束:

// 写
$request->attributes->set('param', $param);
// 读
$user = $request->attributes->get('param');
// 数组写
$request->attributes->add($parameters);
// 是否存在
$request->attributes->has('param');

更多方法,请查看源文件:/vendor/symfony/http-foundation/ParameterBag.php

参数:http://stackoverflow.com/questions/30212390/laravel-middleware-return-variable-to-controller

若您觉得我的博文对您有帮助,欢迎点击下方按钮对我打赏
打赏