哪里存储扩展的Symfony实体逻辑

时间:2016-05-12 10:19:33

标签: symfony

我扩展了一个类(FOSUserBundle),但是在遵循将逻辑与逻辑实体分离的symfony最佳实践时,我创建了一个处理实例化,对象操作等的“逻辑”服务。

当我扩展实体,类型提示,PHPdoc返回对象类型等服务都引用超类而不是新扩展的子类实体时,会出现问题。现在我需要创建新的逻辑(和服务)来处理新的扩展实体。

我不想为每个扩展类重写这个服务/实体逻辑(我怀疑这是不好的做法)。拥有一个可以扩展的超级服务类来处理创建的扩展实体是理想的。

所以我的问题是:#1:编写逻辑类/服务来处理扩展实体的最佳做法是什么?

我的后续问题是:#2:对于像我这样热衷于理解symfony最佳实践的人来说,你能为Symfony设计提供哪些好的资源?我发现symfony网站最好的做法是一个很好的入门,但缺乏中级/高级最佳实践。

我期待找到这个答案并感谢你能提供的任何帮助: - )

1 个答案:

答案 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();
    }
...