You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Shopware6 App:自定义Hook调用services.cart及Cart Hook请求问题

在自定义Cart Hook的Twig里调用services.cart的方法

1. 先搞定Hook的上下文传递

你的自定义Cart Hook得先把CartService注入并传递到Twig上下文里,不然Twig根本拿不到这个服务。

在Hook定义类里这么写:

use Shopware\Core\System\SalesChannel\SalesChannelContext;
use Shopware\Core\Checkout\Cart\CartService;
use Shopware\Storefront\Framework\Hook\AbstractCartHook;

class YourCustomCartHook extends AbstractCartHook
{
    private CartService $cartService;

    public function __construct(CartService $cartService)
    {
        $this->cartService = $cartService;
    }

    public function getContext(SalesChannelContext $context): array
    {
        return [
            'cartService' => $this->cartService,
            // 其他需要传给Twig的变量也可以加在这
        ];
    }

    // 别忘了实现Hook的其他必要方法,比如返回Hook名称的getHookName()
}

还要在插件的services.xml里注册这个Hook,把服务标签加上:

<service id="Your\Plugin\Namespace\Hook\YourCustomCartHook">
    <argument type="service" id="Shopware\Core\Checkout\Cart\CartService"/>
    <tag name="storefront.hook" hook-name="your-custom-cart-hook"/>
</service>

2. 在Twig里直接调用服务

上下文传好之后,Twig里就能直接用cartService变量调用方法了,举几个常用例子:

{# 获取当前用户的购物车 #}
{% set currentCart = cartService.getCart(context.salesChannelId, context.token) %}

{# 往购物车里加商品 #}
{% do cartService.add(currentCart, '你的商品ID', 1, context) %}

{# 重新计算购物车价格、优惠等 #}
{% do cartService.recalculate(currentCart, context) %}

3. 表单提交的替代方案

原生Cart Hook拿不到Request对象,要处理表单提交的话,换个思路:

  • 前端用AJAX把表单数据提交到你写的自定义控制器,控制器里拿Request,调用CartService处理购物车操作,再返回结果给前端。
  • 或者渲染表单时,把提交地址设为自定义控制器的路由,控制器处理完购物车逻辑后,跳转回购物车页面就行。

内容的提问来源于stack exchange,提问作者Codixio

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 10:25:13