gpt4 book ai didi

php - Laravel:是否可以将 Session 作为依赖项注入(inject)?

转载 作者:行者123 更新时间:2023-12-04 02:49:29 24 4
gpt4 key购买 nike

简短版

我想要实现的是使用 session 作为一个类的依赖,最好与 Laravel 的服务提供者一起使用。这可能吗?

长版本

最近发现session无法被服务提供者访问,因为...

in Laravel the session is handled by StartSession middleware that executes after all the service providers boot phase

( reference )

这对我来说很不方便。我一直在创建一个电子商务网站,其中的购物车使用 session,而 session 应该保留客户已经挑选的商品。

购物车的构造函数过去是这样的……

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 的依赖性(即 code>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 作为依赖项注入(inject) Controller 。

有没有其他方法可以将 session 用作类的依赖项(除了直接将其放入构造函数之外)?

任何建议将不胜感激。

最佳答案

对我来说,注入(inject) Session 似乎是一个很常见的用例,而且缺少这方面的文档有点奇怪。

我已经对 Laravel 5.8 session 进行了一些试验,可能会为您提供一个解决方案。您似乎可以输入提示 Illuminate\Session\Store 类并使用它来检索数据。这将导致类似于以下类的内容:

namespace App\Test;

use Illuminate\Session\Store;

class Cart
{
/**
* @var \Illuminate\Session\Store
*/
private $session;

public function __construct(Store $session)
{
$this->session = $session;
}

public function getItems(): array
{
return $this->session->get('cart') ?? [];
}

public function addItem(string $item): void
{
$this->session->push('cart', $item);
}
}

这个类由 Laravel 依赖容器自动解析。但是,如果您想自己执行此操作,您的服务提供商应该是这样的:

    public function register()
{
$this->app->bind(Cart::class, function (Container $container) {
return new Cart($container->get(Store::class));
});
}

我认为这整件事的问题在于无法在服务提供者中直接访问 session 值,但您可以访问使您能够访问所述值的服务。

您认为此解决方案适合您的用例吗?

关于php - Laravel:是否可以将 Session 作为依赖项注入(inject)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55667746/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com