laravel 前置中间件 后置中间件,laravel 中间件用来做什么
IndexController.php继承了BaseController。
class IndexController扩展BaseController
$用户;//存储登录用户实例
公共函数__construct(){
父级:_ _ construct();
$ this-user=Auth:user();
-
正如上面的代码,它不断报错!提示无法获取用户实例!
各种测试,kernel.php,route.php,BaseController,中间件等。找不到问题。我甚至一度怀疑parent:__contruct()的继承是错误的。
最后发现构造器和中间件的执行顺序有问题:
1.首先执行构造函数。
2.再次调用中间件
所以,我的问题是,登录中间件需要用户登录,先执行构造函数直接获取用户信息。它还没有登录!
百度找到一篇描述这个问题的文章:
https://laravel-China . org/topics/3218/laravel 53-中间件和控制器-构造-方法-执行-序列-问题
里面提到了一句话:
不能直接在构造函数中获取session变量或者认证用户实例!因为中间件还没有启动!
这个描述不准确!
用户登录后,在构造函数中,自然会获得会话变量或者认证用户实例!
或者之前没有执行主中间件!说白了就是秩序问题!
解决方法:
都在route.php
1或使用route:get()- middle(login )
要么使用route:get([ middleware = log in ,XXX])
最好的方法是使用路由组route:group([ middleware = log in ])
或者:
丢弃控制器中使用的用户实例