【问题标题】:Lifecycle Callback Issue When Extending FOSUserBundle User Entity扩展 FOSUserBundle 用户实体时的生命周期回调问题
【发布时间】:2012-03-21 14:03:30
【问题描述】:

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

如果我将这些字段的设置器放在构造函数中,则填充字段(但显然这不适用于 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();
  }

  ...

【问题讨论】:

    标签: php symfony doctrine-orm fosuserbundle


    【解决方案1】:

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

    应该是

    @ORM\PreUpdate
    

    而不是

    @ORM\preUpdate
    

    哪个恕我直言在执行时应该导致错误。

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

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

    我将它与 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;
    

    【讨论】:

    • 发现另一个错误,因为错误的情况下应该发生的错误没有出现。 setUpdatedTimestamp 方法的注释块不是文档块。它以 /* 开头,而不是应以 /** 开头。我猜是因为注释解析器没有解析这个块。
    • 好地方,我现在实际上已经构建了自己的用户包,但毫无疑问这是问题的原因。扩展上还有有趣的东西,我会试一试。我是新来的,所以我还不能投票给你的答案,但我已经给你打勾了。
    • 没有专家,但我强烈建议您依赖 FOSUserBundle 而不是自己实现。该包由 symfony 专家创建,是 symfony 中用户处理的事实上的标准
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-24
    • 1970-01-01
    • 2017-08-21
    • 1970-01-01
    • 1970-01-01
    • 2015-11-15
    • 2021-05-31
    相关资源
    最近更新 更多