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



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

如果我在构造函数中放入这些字段的setter,那么这些字段就会被填充(但显然这在updated_at中不能正确工作)。我添加的其他字段如预期的那样起作用。

您是否需要以某种方式扩展UserListener以允许生命周期事件正常工作?

请在下面找到我的代码,如有任何帮助或建议,我们将不胜感激。

用户实体:

namespace AcmeUserExtensionBundleEntity;
use FOSUserBundleEntityUser as BaseUser;
use DoctrineORMMapping as ORM;
use DoctrineCommonCollectionsArrayCollection;
/**
 * AcmeUserExtensionBundleEntityUser
 *
 * @ORMTable(name="acme_user")
 * @ORMEntity()
 * @ORMHasLifecycleCallbacks()
 */
class User extends BaseUser{
  /**
   * @var integer $id
   * @ORMColumn(name="id", type="integer")
   * @ORMId
   * @ORMGeneratedValue(strategy="AUTO")
   */
  protected $id;
  /**
   * @var datetime $created_at
   * @ORMColumn(name="created_at", type="datetime")
   */
  protected $created_at;
  /**
   * @var datetime $updated_at
   * @ORMColumn(name="updated_at", type="datetime")
   */
  protected $updated_at;
  ...
  public function __construct() {
    parent::__construct();
    $this->created_at = new DateTime;
    $this->updated_at = new DateTime;
  }
  /*
   * @ORMpreUpdate
   */
  public function setUpdatedTimestamp(){
    $this->updated_at = new DateTime();
  }
  ...

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

应该是

@ORMPreUpdate

而不是

@ORMpreUpdate

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

无论如何,我建议您使用中描述的DoctrineExtensionBundlehttp://symfony.com/doc/current/cookbook/doctrine/common_extensions.html。

它有一个可时间戳的(还有更多有用的)行为,所以你不需要自己编码(重新发明轮子)。

我将它与FOSUserBundle一起使用,效果很好。这就是我在用户实体中的定义:

 /**
 * @var DateTime $created
 *
 * @GedmoTimestampable(on="create")
 * @ORMColumn(type="datetime")
 */
protected $created;
/**
 * @var DateTime  $updated
 *
 * @GedmoTimestampable(on="update")
 * @ORMColumn(type="datetime")
 */
protected $updated;

最新更新