2011-11-16 3 views
4

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

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

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

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

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

ответ

7

Если мое понимание хорошее, ваш сервис 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 } 

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

+0

Он прекрасно отвечает на вопрос! Большое спасибо –

+0

, вы должны отметить этот ответ как правильный, если он отвечает на вопрос! –

Смежные вопросы