这是我的第一个问题,请耐心等待。
使用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)的文档,没有运气。
记住我使用了Sonata,否则在我自己的Controller Actions中很容易实现。
您可以将添加到您的实体的侦听器直接添加到您的实体中,该侦听器可以创建/更新订单的日志。
首先,您创建侦听器类:
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
{
...
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句