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

问题描述 投票:3回答:1

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

如果我在构造函数中为这些字段放置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();
  }

  ...
php symfony doctrine-orm fosuserbundle
1个回答
2
投票

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

它应该是

@ORM\PreUpdate

代替

@ORM\preUpdate

恕我直言,执行时应导致错误。

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

它带有Timestampable(以及更多有用的)行为,因此您不需要自己编写代码(重新发明轮子)。

我和FOSUserBundle一起使用它并且工作正常。这就是我在User Entity中的定义如下:

 /**
 * @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;
© www.soinside.com 2019 - 2024. All rights reserved.