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

