创建事件侦听器以更新另一个数据库 table
Create an Event Listener to update another database table
这是我的第一个问题,请多多包涵。
如何实现 postPersist 事件侦听器以在使用 Sonata 创建或更新订单 table 时更新日志 table。
我了解如何在创建新订单后立即使用 prePersist 将信息添加到同一数据库 table。 (见以下代码片段)
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')));
}
}
}
但我不完全理解在更新另一个 table 时我将如何执行此操作,因为它不是同一个实体。
创建订单的那一刻,(我认为)一个 postPersist 应该使用该订单的 ID 和一些额外信息更新另一个 table。
我觉得字里行间是这样的;
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 将如何改变。例如 'edited' 或 'approved'。我一直在阅读 Sonata 的文档,但运气不佳,除非我错过了一些阅读内容。
记住我使用的是 Sonata,否则这在我自己的 Controller Actions 中很容易实现。
您可以直接向您的实体添加一个侦听器,create/update 您的订单日志。
首先创建侦听器 class :
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 }
最后,link 你的实体给听众(这里有注释):
/**
* @ORM\EntityListener("YOUR\NAMESPACE\OrderListener")
*/
class Order
{
...
}
这是我的第一个问题,请多多包涵。
如何实现 postPersist 事件侦听器以在使用 Sonata 创建或更新订单 table 时更新日志 table。
我了解如何在创建新订单后立即使用 prePersist 将信息添加到同一数据库 table。 (见以下代码片段)
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')));
}
}
}
但我不完全理解在更新另一个 table 时我将如何执行此操作,因为它不是同一个实体。
创建订单的那一刻,(我认为)一个 postPersist 应该使用该订单的 ID 和一些额外信息更新另一个 table。
我觉得字里行间是这样的;
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 将如何改变。例如 'edited' 或 'approved'。我一直在阅读 Sonata 的文档,但运气不佳,除非我错过了一些阅读内容。
记住我使用的是 Sonata,否则这在我自己的 Controller Actions 中很容易实现。
您可以直接向您的实体添加一个侦听器,create/update 您的订单日志。
首先创建侦听器 class :
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 }
最后,link 你的实体给听众(这里有注释):
/**
* @ORM\EntityListener("YOUR\NAMESPACE\OrderListener")
*/
class Order
{
...
}