Symfony 的新手(第 5 版),第一次接触 Doctrine。我浏览了有关此的各种其他帖子和文档,但无济于事。
我有一个简单的实体,CRUD 表单都可以正常工作。我想在实体被保存(“上次更新”)时为它们加上时间戳,并想出一种方法来使用 Doctrine 提供的事件。
这是实体:
<?php
namespace App\Entity;
use App\Utility\Role;
use App\Utility\SystemTime;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Security\Core\User\UserInterface;
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Component\Security\Core\Encoder\EncoderFactory;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
/**
* @ORM\Entity(repositoryClass="App\Repository\UserRepository")
* @UniqueEntity(
* fields={"username", "email"},
* errorPath="username",
* message="This username or email address is already registered."
* )
* @ORM\HasLifecycleCallbacks
*/
class User implements UserInterface {
/**
* @ORM\Column(type="integer")
*/
private $created;
/**
* @ORM\Column(type="integer")
*/
private $changed;
code.....
public function getCreated(): int
{
return $this->created;
}
public function setCreated(int $created): self
{
$this->created = $created;
return $this;
}
public function getChanged(): int
{
return $this->changed;
}
public function setChanged(int $changed): self
{
$this->changed = $changed;
return $this;
}
/**
* @ORM\PrePersist
* @ORM\PreUpdate
*/
public function setModifiedTime() : void {
$time = SystemTime::currentTime();
if (is_null($this->created)) {
$this->created = $time;
}
$this->changed = $time;
}
}
创建和编辑方法是样板 Maker CRUD:
/**
* @Route("/new", name="user_new", methods={"GET","POST"})
*/
public function new(Request $request): Response
{
$user = new User();
$form = $this->createForm(UserType::class, $user);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$entityManager = $this->getDoctrine()->getManager();
$entityManager->persist($user);
$entityManager->flush();
return $this->redirectToRoute('user_index');
}
return $this->render('user/new.html.twig', [
'user' => $user,
'form' => $form->createView(),
'button_label' => "Create User",
]);
}
/**
* @Route("/{id}/edit", name="user_edit", methods={"GET","POST"})
*/
public function edit(Request $request, User $user): Response
{
$form = $this->createForm(UserType::class, $user);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$this->getDoctrine()->getManager()->flush();
return $this->redirectToRoute('user_index');
}
return $this->render('user/edit.html.twig', [
'user' => $user,
'form' => $form->createView(),
]);
}
根据Lifecycle Callback Events 上的文档页面,这应该是我所需要的,除非我没有在某些东西上连接点。各种文章说要么在构造函数中设置这些值,要么在控制器的创建/编辑方法中设置它们。两者似乎都不正确,当这种情况似乎是生命周期回调事件的目的时。
我看到有一个 Doctrine 捆绑包,其中包含听起来可以“解决”这个问题的行为,但我真的很想先自己学习如何去做。
编辑:看起来 PrePersist 有效,但 PreUpdate 从来没有(改变的值永远不会改变)。更改用户密码 (plainPassword) 无效,但更改用户名或角色会触发该方法。为什么更新密码不会触发事件?