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

Shopware 6.5监听订单事件无日志输出,请求排查问题

问题排查与修复方案

你的代码存在多处配置不匹配和缺失,导致下单后没有日志输出,具体问题和修复如下:

1. 服务配置与订阅类完全不匹配

  • 你的PHP类是OrderSubmittedSubscriber(位于src/EventSubscriber/目录),但services.xml里配置的服务ID是ClpOrderListener\Listener\OrderSubmittedListener,类名、命名空间完全对应不上,导致订阅类根本没被注册。
  • 另外,你的类实现了EventSubscriberInterface,应该使用kernel.event_subscriber标签,而非kernel.event_listener标签(后者是给普通事件监听器用的)。

2. 事件监听配置冲突

  • 订阅类里声明监听checkout.order.placed事件,但services.xml里的监听器却绑定了order.written事件,两个事件完全无关,自然无法触发你写的onOrderPlaced方法。

3. 缺失Logger构造注入

  • 类里声明了LoggerInterface属性,但没有编写构造函数注入Logger服务,即使订阅生效,调用$this->logger时也会报错,无法输出日志。

修正后的代码示例

修正后的OrderSubmittedSubscriber.php

<?php

namespace ClpOrderListener\EventSubscriber; // 确保命名空间与服务ID对应

use Psr\Log\LoggerInterface;
use Shopware\Core\Checkout\Cart\Event\CheckoutOrderPlacedEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;

class OrderSubmittedSubscriber implements EventSubscriberInterface
{
    private LoggerInterface $logger;

    // 新增构造函数注入Logger
    public function __construct(LoggerInterface $logger)
    {
        $this->logger = $logger;
    }

    public static function getSubscribedEvents(): array
    {
        return [
            // 推荐使用类常量,避免字符串拼写错误
            CheckoutOrderPlacedEvent::class => 'onOrderPlaced',
            // 'checkout.order.placed' => 'onOrderPlaced', // 字符串形式也可以,但类常量更可靠
        ];
    }

    public function onOrderPlaced(CheckoutOrderPlacedEvent $event): void
    {
        $orderId = $event->getOrderId();
        $state = $event->getOrder()->getStateMachineState()->getName();

        $this->logger->notice('onOrderPlaced orderId: '.var_export($orderId, true));
        $this->logger->notice('onOrderPlaced state: '.var_export($state, true));
    }
}

修正后的services.xml

<?xml version="1.0" ?>

<container xmlns="http://symfony.com/schema/dic/services"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd">

    <services>
        <!-- 服务ID要与订阅类的完整命名空间+类名一致 -->
        <service id="ClpOrderListener\EventSubscriber\OrderSubmittedSubscriber">
            <argument type="service" id="logger"/>
            <!-- 实现EventSubscriberInterface的类用这个标签 -->
            <tag name="kernel.event_subscriber"/>
        </service>
    </services>
</container>

额外注意事项

  • 确保你的插件命名空间正确,比如ClpOrderListener是插件的根命名空间,要与插件的composer.json里的autoload配置对应。
  • 修复后需要清除Shopware缓存(bin/console cache:clear),确保新的服务配置生效。
  • CheckoutOrderPlacedEvent确实是Shopware 6中用户下单成功后触发的正确事件,你没有选错事件,只是配置错误导致没触发。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 14:57:45