0

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) 无效,但更改用户名或角色会触发该方法。为什么更新密码不会触发事件?

4

0 回答 0