2012-03-21 45 views
3

我剛剛第一次將FOSUserBundle導入symfony2項目,並且在擴展用戶實體時發現了一個問題。我用prePersist和preUpdate生命週期回調添加了created_at和updated_at字段,但是這些方法沒有被讀取。擴展FOSUserBundle用戶實體時的生命週期回調問題

如果我在構造函數中爲這些字段設置了setter,那麼這些字段會被填充(但顯然這對於​​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(); 
    } 

    ... 

回答

2

快看,我只能發現一個小錯誤與註解名的情況後。

它shoudld是

@ORM\PreUpdate 

和不

@ORM\preUpdate 

當被執行時,其IMHO應導致一個錯誤。

無論如何,我建議你使用http://symfony.com/doc/current/cookbook/doctrine/common_extensions.html中描述的DoctrineExtensionsBundle。

它帶有一個Timestampable(和更多有用的)行爲,所以你不需要自己編碼(重新發明輪子)。

我與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; 
+0

Spottet另一個錯誤,因爲由於錯誤情況應該出現的錯誤不會出現。 setUpdatedTimestamp方法的註釋塊不是docblock。它以/ *開始,而不是由/ **開始。我想由於註解解析器不解析這個塊。 – room13 2012-05-21 11:32:22

+0

好點,我已經建立了自己的用戶包,但毫無疑問,這是問題的原因。在擴展中也有趣的東西,我會給它一個。我在這裏是新的,所以我不能投票你的答案,但我已經給你打勾。 – Mark 2012-05-22 16:18:25

+1

沒有問題的伴侶,但我強烈建議依靠FOSUserBundle而不是實現自己的。該軟件包由symfony專家創建,並且是用戶在symfony中處理的事實標準 – room13 2012-05-23 13:38:32