我刚刚第一次将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;