Shopware 6商品页面加载时获取购物车:已实现CartService但需令牌
在商品页面加载事件中获取当前购物车的解决方案
你可以通过请求上下文获取购物车令牌,再结合已实现的CartService来获取购物车,核心实现逻辑如下:
1. 注入必要服务
确保监听器类中注入CartService和请求处理服务(以Symfony的RequestStack为例,其他框架可替换为对应获取当前请求的方式):
use Symfony\Component\HttpFoundation\RequestStack; use YourApp\Service\CartService; use YourApp\Event\ProductPageLoadedEvent; class ProductPageLoadedListener { private CartService $cartService; private RequestStack $requestStack; public function __construct(CartService $cartService, RequestStack $requestStack) { $this->cartService = $cartService; $this->requestStack = $requestStack; }
2. 在事件方法中获取购物车
从当前请求中提取购物车令牌(通常存储在Cookie、Session或请求参数中),再调用CartService获取购物车:
public function onProductPageLoadedEvent(ProductPageLoadedEvent $event) { $request = $this->requestStack->getCurrentRequest(); // 从Cookie中获取令牌(根据实际存储位置调整,比如Session) $cartToken = $request->cookies->get('cart_token'); if ($cartToken) { // 通过令牌获取已有购物车 $cart = $this->cartService->getCartByToken($cartToken); // 后续可对购物车进行操作 } else { // 无令牌时创建新购物车 $cart = $this->cartService->createNewCart(); // 将新购物车令牌写入Cookie(需确保事件可获取Response对象) if ($response = $event->getResponse()) { $response->headers->setCookie( new \Symfony\Component\HttpFoundation\Cookie('cart_token', $cart->getToken()) ); } } } }
补充说明
- 如果你的事件类
ProductPageLoadedEvent本身携带了购物车令牌或用户上下文,可直接通过$event对象获取(比如$event->getUser()->getCartToken()),无需从请求中提取 - 确认
CartService的getCartByToken方法已正确实现,传入令牌即可返回对应购物车实例
内容的提问来源于stack exchange,提问作者Leon Schwanitz
相关产品推荐
相关产品推荐

