2016-07-08 5 views
1

это мой первый вопрос, поэтому, пожалуйста, несите меня.Создайте Event Listener для обновления другой таблицы базы данных

Как я могу реализовать прослушиватель событий PostPersist для обновления таблицы журналов при создании или обновлении заказа в таблице заказов с помощью Sonata.

Я понимаю, как использовать prePersist для добавления информации в ту же таблицу базы данных, как только я создам новый порядок. (См следующий фрагмент кода)

public function prePersist(LifecycleEventArgs $args) 
{ 
    $order = $args->getEntity(); 

    if ($order instanceof PmodOrder) { 
     $user = $this->serviceContainer->get('security.token_storage')->getToken()->getUser(); 

     if ($user) { 
      $order->setCreatedBy($user); 
      $order->setCreatedAt(new \DateTime(date('Y-m-d H:i:s'))); 
     } 
    } 
} 

Но я не совсем понимаю, как я хотел бы сделать это при обновлении другой таблицы, потому что это не то же самое лицо.

В тот момент, когда создается заказ, (я думаю) postPersist должен обновить другую таблицу с идентификатором заказа и дополнительной информацией.

Я думаю, что-то между линиями вроде этого;

public function postPersist(LifecycleEventArgs $args) 
{ 
    $log = $args->getEntity(); 

    if ($log instanceof PmodLog) { 
     $order = ....; 
     $user = $this->serviceContainer->get('security.token_storage')->getToken()->getUser(); 
     $department = $this->serviceContainer->get('security.token_storage')->getToken()->getUser()->getDepartment(); 

     if ($order) { 
      $log->setOrder($order); 
      $log->setCreatedBy($user); 
      $log->setCreatedAt(new \DateTime(date('Y-m-d H:i:s'))); 
      $log->setDepartment($department); 
      $log->setAction("created"); 
     } 
    } 
} 

Я не понимаю, как получить текущий заказ, в котором я занят. И как setAction будет чем-то другим, когда пользователь изменит порядок. Например, «отредактировано» или «одобрено». Мне не удалось получить документацию о Сонате, если я не пропущу что-то.

Помните, что я использую Sonata, иначе это было бы легко реализовать в моих собственных действиях Controller.

ответ

1

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

Сначала вы создаете класс слушателя:

use Doctrine\ORM\Event\LifecycleEventArgs; 

class OrderListener 
{ 

    public function postPersist(Order $order, LifecycleEventArgs $event) 
    { 
     // for example 
     // if you want to store the date creation : 
     if($order->getId() == null) 
     { 
      $order->setDateCreate(new \DateTime('now')); 
     } 
     // if you want to store the last update date : 
     $order->setDateUpdate(new \DateTime('now')); 

     //... or whatever you want to store... 
    } 
} 

Затем зарегистрировать его в service.yml:

order_listener: 
    class: YOUR\NAMESPACE\OrderListener 
    tags: 
     - { name: doctrine.orm.entity_listener } 

Наконец, связать свою сущность к слушателю (здесь с аннотациями):

/** 
* @ORM\EntityListener("YOUR\NAMESPACE\OrderListener") 
*/ 
class Order 
{ 

    ... 

} 
+0

Благодарим за ответ. Я собираюсь попробовать это сейчас (не смог проверить его в выходные). Я не совсем понимаю, как это происходит с тем фактом, что Log - это полная другая сущность. –

+0

Слушатель не является новой сущностью. Вы создаете прослушиватель, тогда вам нужно добавить аннотацию в верхней части сущности для прослушивания (здесь, Заказ), чтобы связать ее с вашим слушателем (см. Последний блок кода моего ответа). Но если вы хотите добавить новый объект, который служит для хранения всех модификаций, вы можете (например, класс OrderLog). –

+0

Спасибо, я понял. –

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

  • Нет связанных вопросов^_^