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

