Shopware 6.6:如何正确为StorableFlow存储填充数据?
解决StorableFlow无法获取Order数据的问题
1. 确认OrderAware接口的定义正确性
先检查OrderAware的常量定义是否准确,这是存入和读取Store的关键标识:
interface OrderAware { public const ORDER = 'order'; public const ORDER_ID = 'order_id'; }
2. 在Flow触发入口主动填充StorableFlow
无论通过事件、控制器还是CLI触发Flow,必须在执行Flow前将Order数据存入StorableFlow的Store中。示例如下:
// 订单创建事件监听器中触发Flow的示例 public function onOrderCreated(OrderCreatedEvent $event): void { $order = $event->getOrder(); // 创建对应Flow实例 $flow = $this->flowFactory->create(SameDayMailFlow::class); // 将Order数据存入StorableFlow $flow->setStore(OrderAware::ORDER, $order); $flow->setStore(OrderAware::ORDER_ID, $order->getId()); // 执行Flow $this->flowExecutor->execute($flow); }
3. 配置上下文填充器(框架支持时)
如果你的Flow框架支持自动填充Aware接口上下文,可注册专门的上下文填充器来自动注入Order数据:
# 示例Flow配置文件 flow: flows: same_day_mail_flow: actions: - App\Flow\Action\SameDayMailAction context_fillers: - App\Flow\ContextFiller\OrderContextFiller
对应的填充器实现:
class OrderContextFiller implements ContextFillerInterface { public function __construct(private OrderRepository $orderRepository) {} public function fill(StorableFlow $flow, array $context): void { if (isset($context['order_id'])) { $order = $this->orderRepository->find($context['order_id']); if ($order) { $flow->setStore(OrderAware::ORDER, $order); $flow->setStore(OrderAware::ORDER_ID, $order->getId()); } } } }
4. 优化Action中的错误日志
当前代码的错误日志仅输出null,可修改为打印完整Store内容,方便排查:
public function handleFlow(StorableFlow $flow): void { if (!$flow->hasStore(OrderAware::ORDER) || !$flow->hasStore(OrderAware::ORDER_ID)) { $this->logger->error('StorableFlow缺少Order或OrderId数据,当前Store内容: ' . json_encode($flow->getStores())); return; } $order = $flow->getStore(OrderAware::ORDER); $orderId = $flow->getStore(OrderAware::ORDER_ID); // 后续业务逻辑保持不变... }
常见排查要点
- 确认触发Flow时,Order对象已完成持久化(具备有效ID),避免存入未保存的实体导致ID为空。
- 检查StorableFlow的序列化机制:若Order是ORM实体,需确保它能被正确序列化(比如实现
Serializable接口,或框架支持实体序列化)。 - 验证Flow执行顺序:确保数据填充步骤在
SameDayMailAction执行前完成。
内容的提问来源于stack exchange,提问作者EKnot
相关产品推荐
相关产品推荐

