Intereting Posts

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

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

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

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

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

UserEntity:

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

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

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

Это будет

 @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;