Shopware6中如何在订单创建时将状态从open改为quote?
Shopware 订单状态切换不生效修复方案
现有代码问题梳理
- 方法参数定义错误:
onQuoteOrder仅接收1个EntityWrittenEvent类型参数,你定义了两个参数,且从未初始化$payloads变量,所有赋值逻辑全部无效 - 状态修改方式不符合Shopware规范:Shopware的订单状态受状态机管控,禁止直接修改
stateId字段,必须通过状态机服务触发流转,否则会跳过关联校验、联动逻辑,导致修改不生效 - 代码逻辑中断:你在方法中添加了
die()语句,后续的状态更新逻辑完全不会执行 - 依赖注入不匹配:构造函数注入的
stateMachineRepository和类中定义的$stateMachineStateRepository属性名称不一致,无法正常调用依赖
修复后的实现代码
<?php declare(strict_types=1); namespace RequestanOffer\Subscriber; use Shopware\Core\Checkout\Order\OrderEvents; use Shopware\Core\Framework\DataAbstractionLayer\Event\EntityWrittenEvent; use Shopware\Core\Framework\DataAbstractionLayer\EntityRepositoryInterface; use Shopware\Core\System\StateMachine\StateMachineRegistry; use Shopware\Core\System\StateMachine\Transition; use Symfony\Component\EventDispatcher\EventSubscriberInterface; class Subscriber implements EventSubscriberInterface { // 替换为你自定义状态对应的流转动作技术标识 private const QUOTE_OPEN_TRANSITION = 'to_quote_open'; private EntityRepositoryInterface $orderRepository; private StateMachineRegistry $stateMachineRegistry; public function __construct( EntityRepositoryInterface $orderRepository, StateMachineRegistry $stateMachineRegistry ) { $this->orderRepository = $orderRepository; $this->stateMachineRegistry = $stateMachineRegistry; } public static function getSubscribedEvents(): array { return [ // 原有产品页、购物车、结算页事件保持不变 OrderEvents::ORDER_WRITTEN_EVENT => 'onQuoteOrder' ]; } public function onQuoteOrder(EntityWrittenEvent $event): void { // 只处理首次创建的订单,避免后续订单更新重复触发状态流转 foreach ($event->getWriteResults() as $writeResult) { if ($writeResult->getOperation() !== 'insert') { continue; } $orderId = $writeResult->getPrimaryKey(); $context = $event->getContext(); try { // 调用官方状态机服务触发状态流转 $this->stateMachineRegistry->transition( new Transition( 'order', $orderId, self::QUOTE_OPEN_TRANSITION, 'stateId' ), $context ); } catch (\Exception $e) { // 可自行对接日志服务记录流转错误信息 continue; } } } }
额外配置注意事项
- 你需要先在后台「设置>商城>状态机与流程>订单状态」配置项中,给订单默认的open状态添加到自定义quote状态的流转动作,再把代码中
QUOTE_OPEN_TRANSITION常量值替换为你配置的流转动作技术名称 - 记得同步更新插件的
services.xml文件,给当前订阅器注入state_machine.registry服务,替换之前注入的状态机仓库服务
内容的提问来源于stack exchange,提问作者babita verma
相关产品推荐
相关产品推荐

