创建事件侦听器以更新另一个数据库表

时间:2016-07-08 12:30:42

标签: php sonata-admin sonata

这是我的第一个问题所以请耐心等待。

如何使用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中很容易实现。

1 个答案:

答案 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
{

    ...

}