扩展FOSUserBundle用户实体时的生命周期回调问题


Lifecycle Callback Issue When Extending FOSUserBundle User Entity

我刚刚第一次将FOSUserBundle导入到symfony2项目中,并且在扩展用户实体时注意到了一个问题。我添加了带有prePersist和preUpdate生命周期回调的created_at和updated_at字段,但这些方法没有被读取。

如果我在构造函数中放入这些字段的setter,那么这些字段就会被填充(但显然这在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();
  }
  ...

快速查看后,我只能发现Annotations名称的大小写有一点错误。

应该是

@ORM'PreUpdate

而不是

@ORM'preUpdate

该IMHO在执行时应当导致错误。

无论如何,我建议您使用中描述的DoctrineExtensionBundlehttp://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;