Проблема Обратного Вызова Жизненного Цикла При Расширении Сущности Пользователя FOSUserBundle


Я только что впервые импортировал FOSUserBundle в проект symfony2 и заметил проблему при расширении сущности пользователя. Я добавил поля created_at и updated_at с обратными вызовами жизненного цикла prePersist и preUpdate, но эти методы не читаются.

Если я помещу установщики для этих полей в конструктор, то поля будут заполнены (но, очевидно, это неправильно работает с updated_at). Другие поля, которые я добавил, работали как ожидаемый.

Вам нужно каким-то образом расширить список пользователей, чтобы события жизненного цикла работали правильно?

Пожалуйста, найдите мой код ниже, любая помощь или совет будут очень признательны.

Имя пользователя:

namespace Acme\UserExtensionBundle\Entity;

use FOS\UserBundle\Entity\User as BaseUser;
use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\ArrayCollection;

/**
 * Acme\UserExtensionBundle\Entity\User
 *
 * @ORM\Table(name="acme_user")
 * @ORM\Entity()
 * @ORM\HasLifecycleCallbacks()
 */
class User extends BaseUser{

  /**
   * @var integer $id
   * @ORM\Column(name="id", type="integer")
   * @ORM\Id
   * @ORM\GeneratedValue(strategy="AUTO")
   */
  protected $id;

  /**
   * @var datetime $created_at
   * @ORM\Column(name="created_at", type="datetime")
   */
  protected $created_at;

  /**
   * @var datetime $updated_at
   * @ORM\Column(name="updated_at", type="datetime")
   */
  protected $updated_at;

  ...

  public function __construct() {
    parent::__construct();
    $this->created_at = new \DateTime;
    $this->updated_at = new \DateTime;
  }

  /*
   * @ORM\preUpdate
   */
  public function setUpdatedTimestamp(){
    $this->updated_at = new \DateTime();
  }

  ...
Author: hakre, 2012-03-21

1 answers

После беглого взгляда я могу заметить только небольшую ошибку в случае имени аннотации.

Это должно быть

@ORM\PreUpdate

Вместо

@ORM\preUpdate

, который IMHO должен привести к ошибке при выполнении.

В любом случае я бы посоветовал вам использовать доктрину, описанную в http://symfony.com/doc/current/cookbook/doctrine/common_extensions.html .

Он поставляется с меткой времени (и многими другими полезными) поведениями, поэтому вам не нужно кодировать это по вашему усмотрению (изобретение колеса).

Я использую его вместе с FOSUserBundle, и он отлично работает. Вот как выглядит мое определение в сущности пользователя:

 /**
 * @var \DateTime $created
 *
 * @Gedmo\Timestampable(on="create")
 * @ORM\Column(type="datetime")
 */
protected $created;

/**
 * @var \DateTime  $updated
 *
 * @Gedmo\Timestampable(on="update")
 * @ORM\Column(type="datetime")
 */
protected $updated;
 2
Author: room13, 2018-09-03 11:02:28