Лучшая практика внедрения зависимостей в Symfony2 - PullRequest
4 голосов
/ 16 ноября 2011

Перед сохранением сущности мне нужно скопировать и отформатировать некоторые данные в другой таблице моей БД. Я хочу, чтобы эта задача выполнялась как услуга. Поэтому я описываю сервис в config.yml

services:
my_service:
    class: Acme\Bundle\AcmeBundle\DependencyInjections\MyService
    arguments: 
      entityManager: "@doctrine.orm.entity_manager"

Мне было интересно, как лучше позвонить в эту службу. Единственный способ выяснить это с контроллера:

$entity = new Entity($this->get('my_service'));

Это лучший способ продолжить?

1 Ответ

7 голосов
/ 16 ноября 2011

Если мое понимание хорошее, ваш сервис my_service - это то, что вы хотите сделать, прежде чем сохранить свою сущность. Это сервис, который должен запускаться событием prePersist.

Итак, я бы просто преобразовал этот сервис в слушателя доктрины.

services:
    my_service:
        class: Acme\Bundle\AcmeBundle\DependencyInjections\MyService
        arguments: 
           entityManager: "@doctrine.orm.entity_manager"
        tags:
            - { name: doctrine.event_listener, event: prePersist }

В классе MyService вы теперь должны определить метод prePersist для всего, что вы хотите сделать.

use Doctrine\ORM\Event\LifecycleEventArgs;

class MyService
{
     public function prePersist(LifecycleEventArgs $args)
     {
         $entity = $args->getEntity();
         $entityManager = $args->getEntityManager();
         (...)
    }
}

Вы даже можете удалить аргументы своей службы, поскольку LifecycleEventArgs предоставляет метод для получения менеджера сущностей.

Наконец, у вас есть этот слушатель

services:
    my_service:
        class: Acme\Bundle\AcmeBundle\DependencyInjections\MyService
        tags:
            - { name: doctrine.event_listener, event: prePersist }

Я надеюсь, что это ответ на ваш вопрос

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...