Laravel –在控制器__constructor中使用request()时未设置会话存储

时间:2019-01-16 15:56:07

标签: laravel

我有一个购物车,几乎可以在应用程序的每个页面上使用它。

Cart.php

Cart{
  public $items;
  public function __constructor(){
    if(request()->session()->has('cart')){
      $this->items = request()->session()->get('cart')->items;
    }
  }
}

当我在每条路线上都使用它时,我想尝试将其添加到基本控制器中:

Controller.php

class Controller extends BaseController
{
  use AuthorizesRequests, DispatchesJobs, ValidatesRequests;
  public function __construct(Request $request){
      $this->cart = new Cart();
  }
}

这会导致错误:

  

未根据请求设置会话存储。

我想我理解...我想控制器在启动会话之前已实例化。但是我使用的路由全部在web中间件上。

我该如何做以上工作,或者确保可以访问该会话,并在整个应用程序中共享我的购物车类?

2 个答案:

答案 0 :(得分:0)

有些数据在执行控制器的构造函数时不可用。

有很多解决方案,但是我建议您扩展BaseController并创建一个方法,将购物车中的数据加载到item变量中。 这样,您可以从扩展控制器中扩展与购物车相关的控制器。

其他选项可能是使用特征来存储可能的操作,以加载或处理购物车项目并将其添加到您需要的地方。

答案 1 :(得分:0)

我使用内联中间件选项在@Mozammil的链接的帮助下解决了这个问题,因此我扩展的新控制器看起来像这样:

class Controller extends BaseController
{

  use AuthorizesRequests, DispatchesJobs, ValidatesRequests;
  public function __construct(){
    $this->middleware(function ($request, $next) {
      $this->cart = new Cart();
      return $next($request);
    });
  }

}

现在我可以在应用程序的任何控制器中访问购物车了。