创建事件侦听器以更新另一个数据库 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
{

    ...

}