这是我的第一个问题所以请耐心等待。
如何使用Sonata在订单表中创建或更新订单时,实现postPersist事件监听器来更新日志表。
我了解如何在创建新订单后立即使用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应该使用该订单的ID和一些额外信息更新另一个表。
我认为像这样的行之间的东西;
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 Actions中很容易实现。
答案 0 :(得分: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
{
...
}