Проблема обратного вызова жизненного цикла при расширении пользовательского объекта FOSUserBundle

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

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

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

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

Пользовательская сущность:

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();
  }

  ...

person Mark    schedule 21.03.2012    source источник


Ответы (1)


После беглого просмотра я могу заметить только небольшую ошибку с регистром имени Annotations.

Так должно быть

@ORM\PreUpdate

вместо

@ORM\preUpdate

что ИМХО должно приводить к ошибке при выполнении.

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

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

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

 /**
 * @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;
person room13    schedule 21.05.2012
comment
Выявите другую ошибку из-за того, что ошибка, которая должна произойти из-за неправильного регистра, не появляется. Блок комментариев метода setUpdatedTimestamp не является блоком документации. Он начинается с /*, а не с /**, как должно быть. Я думаю, из-за этого парсер аннотаций не анализирует этот блок. - person room13; 21.05.2012
comment
Хорошее место, я фактически создал свой собственный пользовательский пакет, но, несомненно, это было причиной проблемы. Также интересная вещь по расширениям, я попробую. Я новичок здесь, поэтому пока не могу проголосовать за ваш ответ, но я поставил вам галочку. - person Mark; 22.05.2012
comment
Нет проблем, приятель, но я настоятельно рекомендую полагаться на FOSUserBundle вместо того, чтобы реализовывать свой собственный. Пакет был создан экспертами Symfony и де-факто является стандартом для работы с пользователями в Symfony. - person room13; 23.05.2012