Sylius:如何基于实现 SyliusResourceBundle 的实体创建侦听器

Sylius: How to create listener base on Entity Implementing SyliusResourceBundle

我是 sylius 工作的初学者,我想在订单项目保存在数据库中之前对其进行调整。所以我根据文档 https://docs.sylius.com/en/1.5/book/architecture/events.html

中所说的 sylius.order_item.pre_create 事件创建了一个侦听器

所有 Sylius 包都使用 SyliusResourceBundle,例如,它有一些关于这种格式的内置事件

sylius.resource.pre_create

她是我的监听器配置

services:
    app.listener.order_item:
        class: App\EventListener\OrderItemListener
        tags:
            - { name: kernel.event_listener, event: sylius.order_item.pre_create, method: onSyliusOrderItemPreCreate }

她是我的倾听者Class

<?php

namespace App\EventListener;


use Symfony\Component\EventDispatcher\GenericEvent;
use Sylius\Component\Core\Model\ShopUserInterface;
use App\Entity\Order\OrderItem;
use App\Entity\Order\Order;
use App\Entity\Order\Adjustement;
use App\Repository\Channel\ChannelPricingRepository;
use Sylius\Component\Channel\Context\ChannelContextInterface;
use Sylius\Component\Order\Factory\AdjustmentFactoryInterface;

class OrderItemListener
{

    public function onSyliusOrderItemPreCreate(GenericEvent $event)
    {
       var_dump(''); die;

        $orderItem = $event->getSubject();
        Assert::isInstanceOf($orderItem, OrderItem::class);     
    }
}

但是当我将新产品添加到卡片时没有任何反应。我想念什么?可能是我不太了解概念,或者我做事的方式不对。请帮助我。

我找到了解决问题的方法。事实上,当将产品添加到卡片路由时,sylius_shop_ajax_cart_add_item 是通过 post 方法调用的。做 bin/console debug:router sylius_shop_ajax_cart_add_item 表明 Sylius\Bundle\OrderBundle\Controller\OrderItemController::addAction 方法被执行。在这一个中 $this->eventDispatcher->dispatchPreEvent(CartActions::ADD, $configuration, $orderItem); 被调用并且 CartActions::ADD = 'add'。 所以她的事件是sylius.order_item.pre_add而不是我做的sylius.order_item.pre_create

services:
    app.listener.order_item:
        class: App\EventListener\OrderItemListener
        tags:
            - { name: kernel.event_listener, event: sylius.order_item.pre_add, method: onSyliusOrderItemPreAdd }

谢谢。