SF4 + учение событие - PullRequest
       11

SF4 + учение событие

0 голосов
/ 13 мая 2018

Я играю в новый 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".

...