Я играю в новый Symfony 4. Мне очень нравится, когда сервис использует autowire, а компонент использует аннотации.Я не должна ничего регистрироваться в services.yml.Конечно, я не могу решить все таким образом, но я стараюсь.
Я создаю простой и тестовый проект.Когда у меня есть Пейдж.Страница имеет поле "слаг".Это значение генерируется с помощью поля «заголовок».Я создал специальный сервис (App \ Service \ Slug).Я хотел бы создать слаг в случае, когда страница создается или обновляется.К событию, которое я должен был внедрить службу slug.
Я хотел бы создать один список для только одного объекта - Page.Я нашел: https://symfony.com/doc/current/doctrine/event_listeners_subscribers.html В этом решении событие запускается для всех сущностей, и я должен создать конфигурацию в services.yml.
App\EventListener\PageListener:
tags:
- { name: doctrine.event_listener, event: prePersist }
class PageListener
{
/**
* @var Slug
*/
protected $slug;
/**
* PageListener constructor.
*
* @param Slug $slug
*/
public function __construct(Slug $slug)
{
$this->slug = $slug;
}
public function prePersist(
LifecycleEventArgs $args
) {
$page = $args->getObject();
/** ... */
$slug = $this->slug->get($page->getTitle());
$page->setSlug($slug);
/** ... */
}
}
В этом решении событие запускается во всех элементах, и ядолжен проверить экземпляр.
Я помню, что в sf2.8 я мог бы добавить примечание к сущности (EntityListeners) -> https://www.doctrine -project.org / projects / doctrine-orm / en / latest /reference / events.html В этой версии Symfony я вижу эту аннотацию, но она не работает.Я нашел только старую кулинарную книгу: https://symfony.com/doc/master/bundles/DoctrineBundle/entity-listeners.html
Как мне сделать это правильно?
В заключение я хочу создать простое событие доктрины, которое будет работать только для одного объекта, и его конфигурацияминимальный.
edit: Когда я тестировал, я нашел решение, которое «работает»:
Entity:
/**
* Class Page
*
* @package App\Entity
*
* @ORM\Entity(repositoryClass="App\Repository\ProductRepository")
* @ORM\EntityListeners("App\EventListener\PageListener")
* @ORM\Table(name="pages")
*/
class Page
services.yaml:
App\EventListener\PageListener:
tags:
- { name: doctrine.orm.entity_listener }
PageListener:
public function __construct(Slug $slug)
{
$this->slug = $slug;
}
/**
* @ORM\PrePersist
*/
public function prePersistHandler(Page $user, LifecycleEventArgs $event)
Я не знаю, как или я не могу удалить конфигурацию в "service.yaml".