首页 > 解决方案 > Sylius:如何基于实体实现 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 }

她是我的听众班

<?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-resource

解决方案


我找到了解决我的问题的方法。事实上,当将产品添加到卡路由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 }

谢谢。


推荐阅读