我可以从Controller
访问会话数据,而不传递MyController
的请求吗?
class Controller extends BaseController
{
public function __construct()
{
// ** next line throws error:
// "Session store not set on request."
$userdata = request()->session()->get('userdata');
// I want to inject `userdata` into every template without
// passing data from child controllers.
view()->share(['userdata' => $userdata);
}
}
class MyController extends Controller
{
public function __construct(Request $request)
{
// This works, so the data is in fact in the session.
// I don't want to pass it, or `$request` to the parent from here.
$userdata = $request->session()->get('userdata');
...
}
}
答案 0 :(得分:1)
它无法在您的__construct()
方法中运行的原因是因为StartSession
中间件尚未运行。
要解决此问题,您可以简单地在控制器上使用middleware()
方法:
public function __construct()
{
$this->middleware(function ($request, $next) {
$userdata = $request->session()->get('userdata');
view()->share(compact('userdata'));
return $next($request);
});
}
Laravel 5.3 Upgrade guide(向下滚动 Controllers 部分)
在Laravel 5.3中,由于中间件尚未运行,因此您无法在控制器的构造函数中访问会话或经过身份验证的用户。
或者,您可以直接在控制器的构造函数中定义基于Closure的中间件。