Laravel5.6资源控制器构造函数中中间件变量为null,其他方法可正常获取
问题原因与解决方案
这个问题其实是Laravel请求生命周期的执行顺序导致的——控制器的构造函数会在中间件管道执行之前就运行,所以当你在构造函数里尝试访问中间件设置的变量时,中间件还没来得及处理请求,变量自然是null;而控制器的方法是在所有中间件执行完成之后才被调用的,所以方法里能拿到有效值。
具体解决方案
你可以通过在控制器构造函数中注册一个中间件闭包的方式,让变量的获取逻辑在中间件执行完成后再运行,这样就能拿到正确的值了。示例代码如下:
class PhaseController extends ApiController { // 定义控制器属性存储全局变量 protected $globalVariable; public function __construct() { parent::__construct(); // 注册后置中间件闭包 $this->middleware(function ($request, $next) { // 替换成你中间件设置变量的实际方式 // 比如中间件把变量放到request的attributes里 $this->globalVariable = $request->attributes->get('your_global_key'); // 或者直接绑定到request对象的属性 // $this->globalVariable = $request->your_global_key; // 必须返回$next($request)让请求继续流转 return $next($request); }); } // 资源控制器示例方法 public function index() { // 现在可以直接使用$this->globalVariable return response()->json(['data' => $this->globalVariable]); } }
补充说明
这个闭包会被加入到中间件管道的末尾,在你所有自定义中间件执行完成之后才触发,此时中间件已经完成了全局变量的设置,自然就能获取到正确的值。
如果你不想用控制器属性,也可以直接在需要使用变量的方法里从Request对象中获取——毕竟方法本身就是在中间件之后执行的,直接拿就行,这也是最直接的方式。
内容的提问来源于stack exchange,提问作者aishazafar
相关产品推荐
相关产品推荐

