Symfony 3 событие обновления поля модели

Нужно при обновлении поля title в модели Product запускать определенный метод из сервиса ProductService. увидел что есть EventSubscriber, но не совсем понял логику. Попробовал реализовать путем создания в Event Product/ProductSaveEvent.php который наследуется от Event а в самом EventSubscriber подключил его в getSubscribedEvents() таким образом

public static function getSubscribedEvents()
    {
        return [
            KernelEvents::REQUEST => 'onKernelRequest',
            KernelEvents::RESPONSE => 'onKernelResponse',
            ProdSaveEvent::PRE_SAVE_BRAND => 'onPreProductSave',
        ];
    }

и ниже в этом же классе соответственно метод который нужно стартовать при обновлении модели

public function onPreProductSave(ProductSaveEvent $event, ProductService $productService)
    {
        $request = $event->getRequest();

        $productService->renameFile($request->title);
    }

но не понимаю как он будет отрабатывать и какая связь с моделью, может что то упустил?


Ответы (1 шт):

Автор решения: Borislav
  1. Вам нужен Listener, но конечно, никто не запрещает использовать и Subscriber, но производительность явно пострадает, сказано жирным шрифтом в доке, т.к. подписчик будет вызываться на каждое событие для всех сущностей, а слушатель только для одной.

  2. Создайте класс слушателя - это обычный, ничем не примечательный класс.

  3. Добавьте его конфигурацию в services.yaml.

    App\Event\Listeners\Product\ProductChangedListener: # путь до вашего класса
        tags:
            -
                 name: 'doctrine.orm.entity_listener'    # это говорит Doctrine, что вы добавляете нового слушателя
                 event: 'preUpdate'                      # это событие, на которое он будет инвокаться, preUpdate вам подойдет, т.к. будет просыпать на изменения полей Product
                 entity: 'App\Entity\Product\Product'    # сущность, для которой вы хотите инвать слушатель, она же будет падать в аргументы вызываемого метода
                 method: 'campaignChanged'               # это название метода в самом классе слушателя, который вы хотите вызывать
                 lazy: true                              # загружать ли слушатель лениво, только тогда, когда он действительно будет использоваться, можете смело убрать эту инструкцию
    

Все, этого достаточно, чтоб ваш слушатель заработал.

→ Ссылка