Короткая версия
Чего я хочу добиться, так это использовать 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
..но при таком подходе зависимость Cart
(то есть session
) не может быть разрешена с помощью Service provider
, который не может получить доступ к сеансу (как уже упоминалось).При таком подходе необходимо использовать ключевое слово 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
в качестве зависимости класса (кроме непосредственного помещения его в конструктор)?
Любой совет будет оценен.