MappedSuperclass实体上的HasLifecycleCallbacks

时间:2016-10-21 13:19:31

标签: symfony doctrine-orm

我正在尝试创建一个抽象类来扩展我的实体,以便为它们提供一些基本功能,例如自动时间戳。

所以我创建了这个抽象类:

/**
 * Class Model
 * @package AppBundle
 * @ORM\MappedSuperclass
 */
abstract class Model 
{
    /**
     * @var \DateTime $created_at
     *
     * @ORM\Column(type="datetime")
     */
    protected $created_at;

    /**
     * @var \DateTime $updated_at
     *
     * @ORM\Column(type="datetime")
     */
    protected $updated_at;

    /**
     *
     * @ORM\PrePersist
     * @ORM\PreUpdate
     */
    public function updatedTimestamps()
    {
        $this->setUpdatedAt(new \DateTime('now'));

        if ($this->getCreatedAt() == null) {
            $this->setCreatedAt(new \DateTime('now'));
        }
    }

   public function getUpdatedAt()
   {
       return $this->updated_at;
   }

   public function setUpdatedAt($updated_at)
   {
       $this->updated_at = $updated_at;
   }

   public function getCreatedAt()
   {
       return $this->created_at;
   }

   public function setCreatedAt($created_at)
   {
       $this->created_at = $created_at;
       return $this;
   }

}

所以现在,我只需要从这个类扩展我的实体:

class MyEntity extends Model 
{
    ....
}

但是,如果我希望我的时间戳工作,我仍然需要在MyEntity类之上添加@ORM\HasLifecycleCallbacks以在持久和更新时触发updatedTimestamps()方法。

我尝试在我的超类上添加注释,但它不起作用。

有人会有一个解决方案来避免在每个实体的顶部添加注释吗?

我只想扩展我的超类,那就是......

感谢您的回答,祝您度过愉快的一天!

1 个答案:

答案 0 :(得分:0)

我在之前的项目上实现它,MappedSuperclass上的注释工作。我使用的anotation是括号@ORM\HasLifecycleCallbacks(),而不是@ORM\HasLifecycleCallbacks

这就是我的做法(我以教学方式提供所有MappedSuperclass代码):

AbstractGenericEntity.php

namespace Services\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\MappedSuperclass
 * @ORM\HasLifecycleCallbacks()
 */
class AbstractGenericEntity
{
    /**
     * @var \DateTime
     *
     * @ORM\Column(name="Z_CREATION_DATE", type="datetime", nullable=false)
     */
    private $dateCreation;

    /**
     * @var \DateTime
     *
     * @ORM\Column(name="Z_UPDATE_DATE", type="datetime", nullable=false)
     */
    private $dateMaj;


    // I just need this getter
    public function getUpdateDate($format= 'Y-m-d h:i:s:u') {
        return $this->dateMaj->format($format) ;
    }

    /**
     * @return AbstractGenericEntity
     * @ORM\PreUpdate
     */
    public function preUpdateCallback()
    {
        $this->dateMaj = new \DateTime("now");
        return $this;
    }

    /**
     * @return AbstractGenericEntity
     * @ORM\PrePersist
     */
    public function prePersistCallback()
    {
        $this->preUpdateCallback();
        $this->dateCreation = new \DateTime("now");
        return $this;
    }
}

我的所有实体都继承了这个超类,没有任何特殊的其他注释:

namespace Services\Entity;

use Doctrine\ORM\Mapping as ORM;
use Services\Entity\AbstractGenericEntity;

/**
 * @ORM\Table(name="MY_TABLE_NAME")
 * @ORM\Entity (repositoryClass="Services\Repositories\MyEntityRepository")
 */
class MyEntity extends AbstractGenericEntity
{
    public function __construct()
    {
        $this->id = uniqid('', true);
    }

    /**
     * @var string
     *
     * @ORM\Column(name="ID", type="string", length=23, nullable=false)
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="NONE")
     *
     */
    private $id;

    // etc, as usual...