Symfony4 PrePersist不会触发

时间:2019-05-16 20:24:12

标签: doctrine symfony4

我正在测试Symfony4和Doctrine中的PrePersist和其他事件。

这是我的控制人

<?php
namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Routing\Annotation\Route;
use App\Entity\Contact;
class C00260CallbackController extends AbstractController
{
    /**
     * @Route("/c00260/callback", name="c00260_callback")
     */
    public function index()
    // Callback statements are in the Entity definition
    {
        $entityManager = $this->getDoctrine()->getManager();
        $contact = new Contact();
        $contact->setName('Elodie');
        $contact->setEmail('elodie@email.com');
        //$contact->setTimestamp();
        $entityManager->persist($contact);
        $entityManager->flush();
                return $this->render('c00260_callback/index.html.twig', [
            'controller_name' => 'C00260CallbackController',
        ]);
    }
}

和我的实体

<?php
namespace App\Entity;
/**
 * @ORM\Entity(repositoryClass="App\Repository\UserRepository")
 * @ORM\HasLifecycleCallbacks()
 */
use Doctrine\ORM\Mapping as ORM;
/**
 * @ORM\Entity(repositoryClass="App\Repository\ContactRepository")
 */
class Contact
{
    /**
     * @ORM\PrePersist
     */
    public function setTimestamp()
    {
        $this->timestamp = new date('Y-m-d H:i:s');
        return $this;
        dumpx($this->timestamp);
    }
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;
    /**
     * @ORM\Column(type="string", length=255)
     */
    private $name;
    /**
     * @ORM\Column(type="string", length=255)
     */
    private $email;
    public function getId(): ?int
    {
        return $this->id;
    }
    public function getName(): ?string
    {
        return $this->name;
    }
    public function setName(string $name): self
    {
        $this->name = $name;
        return $this;
    }

    public function getEmail(): ?string
    {
        return $this->email;
    }
    public function setEmail(string $email): self
    {
        $this->email = $email;
        return $this;
    }
}

表格联系人具有所有必填字段

id
名称
电子邮件
时间戳

运行控制器时,我应该在datetime字段中获取当前的Date和Time,但不仅没有任何反应,而且甚至不会调用setTimestamp函数(当在其中放置错误时,它不会出现在执行)

我怎么了?

4 个答案:

答案 0 :(得分:1)

尝试一下,对我来说非常有用: /** * Callback called every time you create a new object * @ORM\PrePersist() * @ORM\PreUpdate * @return Response */ public function prePersist() { if (empty($this->createdAt)) { $this->createdAt = new \DateTime(); } }

并将其放在参数后放在您的实体中

答案 1 :(得分:0)

为什么要使其变得如此复杂,为什么不只是在实体构造函数中设置datetime的默认值呢?这样,每个初始化的联系人都会自动获得一个日期,您始终可以轻松地覆盖它。

如果您不希望这样做,则建议您单独设置一个实体侦听器,否则您的实体会变得肿,难以维护。

希望我有所帮助,问问您是否有疑问

答案 2 :(得分:0)

也许您可以使用实体的__construct ()方法设置时间戳记

__construct(){
$this->timestamp = new \Datetime();

}

答案 3 :(得分:-1)

您可以使用此捆绑包StofDoctrineExtensionsBundle。 并根据需要激活扩展。

在yaml配置中,您可以激活时间戳记。

stof_doctrine_extensions:
    default_locale: en_US
    orm:
        default:
            timestampable: true

,您可以像这样在实体中使用TimestampableEntity。


namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity(repositoryClass="App\Repository\TokenRepository")
 * @ORM\Table(name="tokens")
 */
class Token
{
    use TimestampableEntity;

    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;
}

因此它将自动更新日期字段Updated_at和created_at。 :)

但是如果您想为另一个字段设置事件监听器。您可以像这样创建该侦听器。

在services.yaml中添加

   App\EventListener\EntityListener:
        tags:
            - {name: doctrine.event_subscriber}

在src文件夹中创建Directory EventListener并像这样编写您的侦听器

<?php

namespace App\EventListener;

use Doctrine\Common\EventSubscriber;
use Doctrine\ORM\EntityManagerInterface;
use Doctrine\ORM\Event\LifecycleEventArgs;

class EntityListener implements EventSubscriber
{
    /**
     * @var EntityManagerInterface $em
     */
    private $em;

    /**
     * EntityListener constructor.
     * @param EntityManagerInterface $em
     */
    public function __construct(EntityManagerInterface $em)
    {
        $this->em = $em;
    }

    public function prePersist(LifecycleEventArgs $args)
    {
        $entity = $args->getEntity();

        if ($entity instanceof SomeEntity) {
            //do somthing 
        }
    }

    /**
     * {@inheritdoc}
     */
    public function getSubscribedEvents()
    {
        return ['prePersist'];
    }
}