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
相关产品推荐
相关产品推荐

