我正在测试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函数(当在其中放置错误时,它不会出现在执行)
我怎么了?
答案 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'];
}
}