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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 20:12:02