我有一个购物车,几乎可以在应用程序的每个页面上使用它。
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
中间件上。
我该如何做以上工作,或者确保可以访问该会话,并在整个应用程序中共享我的购物车类?
答案 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);
});
}
}
现在我可以在应用程序的任何控制器中访问购物车了。