Проблема Обратного Вызова Жизненного Цикла При Расширении Сущности Пользователя 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();
}
...
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;