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 шт):
Вам нужен Listener, но конечно, никто не запрещает использовать и Subscriber, но производительность явно пострадает, сказано жирным шрифтом в доке, т.к. подписчик будет вызываться на каждое событие для всех сущностей, а слушатель только для одной.
Создайте класс слушателя - это обычный, ничем не примечательный класс.
Добавьте его конфигурацию в 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 # загружать ли слушатель лениво, только тогда, когда он действительно будет использоваться, можете смело убрать эту инструкцию
Все, этого достаточно, чтоб ваш слушатель заработал.