在laravel5.*中,session start被放到了web中间件中,如
/** * The application's route middleware groups. * * @var array */ protected $middlewareGroups = [ 'web' => [ \App\Http\Middleware\EncryptCookies::class, \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class, \Illuminate\Session\Middleware\StartSession::class, //<--------- \Illuminate\View\Middleware\ShareErrorsFromSession::class, \App\Http\Middleware\VerifyCsrfToken::class, ], 'api' => [ 'throttle:60,1', 'bindings', ], ];
并且根据Route加载中间件的代码可以得知Controller是在被make之后才调用中间件
/** * Get the middleware for the route's controller. * * @return array */ public function controllerMiddleware() { if (! $this->isControllerAction()) { return []; } return ControllerDispatcher::getMiddleware( $this->getController(), $this->getControllerMethod() ); }
这个时候问题就来了,我有一个BaseController,在构造函数里面会判断用户登录状态,如果已经登录就获取登录用户信息保存到$this->login_user_info中供子类调用,如果先make controller,session还没有start,因此在构造函数中是无法获取到登录用户的session_id,部分代码如下
/** * 控制层公有方法集合 * Class BaseController */ abstract class BaseController extends Controller { use AuthorizesRequests, DispatchesJobs, ValidatesRequests; public $login_user_info; public $login_subuser_info; public function __construct() { $this->userModel = app(UserModel::class); if (session()->get('user_id')) { $this->login_user_info = $this->userModel->getLoginUser(); //设置模板全局变量 view()->share(['login_user_info' => $this->login_user_info]); } }
我测试过在middleware中是可以得到session,因为这个时候已经执行了StartSession中间件代码,至于我为什么要这么做就说来话长,我的项目是一个老项目切换框架到laravel,所以为了最大限度的保持原有逻辑,并且还有一些奇奇怪怪的写法,没有采用Auth,这些暂且不论,有没有办法可以在构造函数中得到session,求各位大神帮忙,谢谢
重写 CallAction 在 CallAction中逻辑判断
自己看我的提问,官方的解决方式不符合我们的老思想
https://segmentfault.com/q/10...
原则上来说Controller的构造函数里面不应该放读写session并判断用户登录状态这样代码 -- 而应该放到middleware里面去。
但是既然非要保持原有的逻辑,那就改下laravel的session机制呗。目前我们项目组是自己定义了一个sessionProvider替换了laravel自带的sessionProvider,然后session在make的时候自动启动,一切就好办了。
这种情况下,部分重构是应该首要考虑的,因为不同的方案对应不同的架构么。其次laravel 的 session 不是 php 的$_SESSION,所以你确定 session()->get('user_id')取的是你用 session(['user_id'=>'something']) 存进去的?而不是$_SESSION 里的东西?
https://laravel.com/docs/5.3/...
正解在这里