简版
我想实现的是将session
用作类的依赖项,最好是使用 Laravel 的服务提供程序。这可能吗?
详细版
最近我发现服务提供程序无法访问session
,因为...
在 Laravel 中,会话由 StartSession 中间件处理,该中间件在所有服务提供程序引导阶段之后执行。
(参考链接)
这对我来说非常不方便。我一直在创建一个电子商务网站,购物车正在使用session
,而session
应该保存客户选择的商品。
下面是购物车的constructor
代码:
class Cart
{
private $items;
public function __construct($items)
{
$this->items = $items;
}
//other functions...
}
这里是AppServiceProvider
。
class AppServiceProvider extends ServiceProvider
{
//boot
public function register()
{
$this->app->bind(Cart::class, function () {
return new Cart(session('cart'));
});
}
如前所述,服务提供商无法访问 session('cart')
。
因此,我直接将 session('cart')
放入 Cart
的构造函数中。
class Cart
{
private $items;
public function __construct()
{
$this->items = session('cart');
}
}
这种方式,Cart
总是依赖于 session
... 但是,采用这种方法,无法通过 Service provider
来解决 Cart
的依赖关系(即 session
),因为 Service provider
无法访问 session(如前所述)。采用这种方法,必须使用 new
关键字来实例化 Cart
。
即
class SomeController extends Controller
{
private $cart;
public function __construct(Cart $cart)
{
$this->cart = $cart;
}
public index()
{
$this->cart;
//This will get null in its $items property,
//because Service Providers can't access session
$cart = new Cart();
//This can get items from session()
}
}
使用 new Cart()
并不是非常理想。我希望将 Cart
作为依赖项注入到控制器中。
除了直接将 session
放入构造函数之外,是否有其他方法可以将其用作类的依赖项?
非常感谢您的建议。