从父控制器访问会话数据而无需传入

时间:2019-07-08 20:20:24

标签: laravel

我可以从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');
        ...
    }
}

1 个答案:

答案 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的中间件。