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

Shopware 6.5事件订阅者检测订单及获取订单状态方法

在Shopware 6.5中获取订单状态的解决方案

你当前通过ORDER_WRITTEN_EVENT只能拿到payload里的字段,而订单状态可能不在payload中(比如创建时状态未被显式修改,或事件触发时实体未完整加载),可以通过以下两种方式获取订单状态:

方法1:从WriteResult中直接获取订单实体

如果事件触发时订单实体已被加载,可直接从WriteResult中获取完整实体,进而拿到状态:

use Shopware\Core\Checkout\Order\OrderEntity;
use Shopware\Core\Framework\DataAbstractionLayer\Event\EntityWrittenEvent;
use Shopware\Core\Framework\DataAbstractionLayer\Write\WriteResult;

public function OnOrderReceived(EntityWrittenEvent $event) { 
    if ($event->getEntityName() === 'order') {
        $writtenEntities = $event->getWriteResults();
        foreach ($writtenEntities as $writeResult) {
            // 仅处理新创建的订单(可选,按需调整)
            if ($writeResult->getOperation() !== WriteResult::OPERATION_INSERT) {
                continue;
            }
            
            /** @var OrderEntity|null $order */
            $order = $writeResult->getEntity();
            if ($order instanceof OrderEntity) {
                // 获取状态技术名称(如'open'、'completed')
                $stateTechnicalName = $order->getStateMachineState()->getTechnicalName();
                // 获取本地化状态名称(可选)
                $stateDisplayName = $order->getStateMachineState()->getName();
                
                $this->logger->info('新订单创建,ID: ' . $order->getId() . ',订单号: ' . $order->getOrderNumber() . ',状态: ' . $stateTechnicalName);
            }
        }
    }
}

方法2:通过订单仓库查询完整订单

如果getEntity()返回null(比如实体未被加载),可以注入订单仓库,根据ID查询完整订单并关联状态:

第一步:注入订单仓库

在服务类构造函数中注入OrderRepositoryInterface:

use Shopware\Core\Checkout\Order\OrderRepositoryInterface;

class YourOrderEventListener
{
    private OrderRepositoryInterface $orderRepository;

    public function __construct(OrderRepositoryInterface $orderRepository)
    {
        $this->orderRepository = $orderRepository;
    }

    // 事件处理方法...
}

第二步:在事件中查询订单

use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;

public function OnOrderReceived(EntityWrittenEvent $event) { 
    if ($event->getEntityName() === 'order') {
        $writtenEntities = $event->getWriteResults();
        foreach ($writtenEntities as $writeResult) {
            if ($writeResult->getOperation() !== WriteResult::OPERATION_INSERT) {
                continue;
            }
            
            $orderId = $writeResult->getPayload()['id'];
            
            // 创建查询条件,关联状态机状态
            $criteria = new Criteria([$orderId]);
            $criteria->addAssociation('stateMachineState');
            
            // 查询订单
            $order = $this->orderRepository->search($criteria, $event->getContext())->first();
            if ($order) {
                $stateTechnicalName = $order->getStateMachineState()->getTechnicalName();
                $this->logger->info('新订单创建,ID: ' . $orderId . ',订单号: ' . $order->getOrderNumber() . ',状态: ' . $stateTechnicalName);
            }
        }
    }
}

注意事项

  • ORDER_WRITTEN_EVENT会在订单创建、更新、删除时触发,通过WriteResult::OPERATION_INSERT可过滤出仅新创建的订单。
  • 状态技术名称(如open、in_progress)比显示名称更适合逻辑判断,显示名称会随店铺语言变化。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 07:52:42