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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 23:11:05