我决定创建一个'MappedSuperclass',它将被所有其他实体扩展,以便在它们之间轻松共享两个公共字段,它看起来像这样:
/**
* @ORM'MappedSuperclass
*/
abstract class EntityBase {
/**
* @ORM'Column(type="datetime")
*/
protected $created_at;
/**
* @ORM'Column(type="datetime", nullable=true)
*/
protected $updated_at;
/**
* @ORM'PrePersist
* @ORM'PreUpdate
*/
public function updateTimestamps() {
$this->updated_at = new 'DateTime('now');
if(is_null($this->created_at)) {
$this->created_at = new 'DateTime('now');
}
}
}
我的问题是,在使用generate:entities
命令后,脚本将字段(作为私有)以及updateTimestamps
函数(为空)复制到所有子类。
是否有可能防止这种行为?现在我只有5个实体,所以手动删除不需要的代码不是什么大问题,但当项目增长到20个或更多实体时,可能会很痛苦。
或者这不是满足我需求的正确方式?
如果你将一个类定义为抽象类,它将被解释为'要实现'。这就是为什么在实际类中使用虚拟函数来实现该特性的原因。您应该扩展一个常规类来继承字段和更新时间戳的函数。
如果继承实体类,必须将父类的属性设置为private。子类只能通过getter/setter访问它们。我有同样的问题前一段时间,使属性私有工作像一个魅力。