我扩展了一个类(FOSUserBundle),但是在遵循将逻辑与逻辑实体分离的symfony最佳实践时,我创建了一个处理实例化,对象操作等的“逻辑”服务。
当我扩展实体,类型提示,PHPdoc返回对象类型等服务都引用超类而不是新扩展的子类实体时,会出现问题。现在我需要创建新的逻辑(和服务)来处理新的扩展实体。
我不想为每个扩展类重写这个服务/实体逻辑(我怀疑这是不好的做法)。拥有一个可以扩展的超级服务类来处理创建的扩展实体是理想的。
所以我的问题是:#1:编写逻辑类/服务来处理扩展实体的最佳做法是什么?
我的后续问题是:#2:对于像我这样热衷于理解symfony最佳实践的人来说,你能为Symfony设计提供哪些好的资源?我发现symfony网站最好的做法是一个很好的入门,但缺乏中级/高级最佳实践。
我期待找到这个答案并感谢你能提供的任何帮助: - )
答案 0 :(得分:0)
我通过扩展包含扩展实体逻辑的服务类并重写两个方法(构造函数和一个新创建的方法,现在只包含" new className"行)解决了这个问题。这允许覆盖服务方法以改变所使用的存储库(到子类),因此使用该实体的存储库new的所有其他服务方法都引用扩展实体的存储库。覆盖包含" new className()"的方法使用" new extendedClassName()"也允许我使用工厂方法。
现在代码看起来很棒,我可以重复使用这些东西!
包含子实体特定方法和类overiddes的子类服务如下所示:
class PersonManager extends BasePersonManager
{
public function __construct(EntityManager $em, EventDispatcherInterface $dispatcher)
{
$this->em = $em;
$this->repo = $this->em->getRepository('TwenchaBundle:person');
$this->dispatcher = $dispatcher;
}
public function createNew () {
return new person();
}
}
虽然基本服务类看起来像这样:
class BasePersonManager
{
protected $em;
protected $repo;
protected $dispatcher;
public function __construct(EntityManager $em, EventDispatcherInterface $dispatcher)
{
$this->em = $em;
$this->repo = $this->em->getRepository('PersonBundle:BasePerson');
$this->dispatcher = $dispatcher;
}
public function createNew () {
return new BasePerson();
}
...