我正在尝试创建一个抽象类来扩展我的实体,以便为它们提供一些基本功能,例如自动时间戳。
所以我创建了这个抽象类:
/**
* 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()
方法。
我尝试在我的超类上添加注释,但它不起作用。
有人会有一个解决方案来避免在每个实体的顶部添加注释吗?
我只想扩展我的超类,那就是......
感谢您的回答,祝您度过愉快的一天!
答案 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...