可以使用Doctrine的resolve_target_entities来发现存储库吗?

时间:2016-03-25 09:53:37

标签: php symfony doctrine-orm

我在两个项目( ProjectA ProjectB )上使用Symfony 2.8.3和Doctrine 2.4.8,并希望在我的包中创建一个共享服务( SharedBundle )。

此服务需要在数据库上运行,因此我认为我可以使用config.yml中的resolve_target_entities指令从SharedBundle访问我的项目存储库(在ProjectA和ProjectB中定义)。

存储库看起来像这样:

<?php

namespace My\ProjectA\Repository;

class FooRepository extends \Doctrine\ORM\EntityRepository
{
    // ...
}

首次尝试 - 界面

应用程序/配置:

doctrine:
    orm:
        # ...
        resolve_target_entities:
            My\SharedBundle\Model\FooInterface: My\ProjectA\Entity\Foo

所以我创建了一个界面:

<?php

namespace My\SharedBundle\Model;

interface FooInterface 
{
}

实体实现此接口

<?php

namespace My\ProjectA\Entity;

class Foo implements \My\SharedBundle\Model\FooInterface
{
    // ...
}

尝试从SharedService访问存储库,如下所示:

$repository = $this->entityManager->getRepository(\My\SharedBundle\Model\FooInterface::class);

这引发:

Class 'My\SharedBundle\Model\FooInterface' does not exist

第二次尝试 - 抽象实体

应用程序/ config.yml

doctrine:
    orm:
        # ...
        resolve_target_entities:
            My\SharedBundle\Model\AbstractFoo: My\ProjectA\Entity\Foo

我创建了一个抽象实体

<?php

namespace My\SharedBundle\Model;

abstract class AbstractFoo
{
    // ...
}

继承:

<?php

namespace My\ProjectA\Entity;

class Foo extends AbtractFoo
{
    // ...
}

现在我想从SharedService访问存储库,如下所示:

$repository = $this->entityManager->getRepository(\My\SharedBundle\Model\AbstractFoo::class);

但是这引发了:

The class 'My\SharedBundle\Model\AbstractFoo' was not found in the chain configured namespaces My\ProjectA\Entity

这仅适用于学说关系吗?

1 个答案:

答案 0 :(得分:1)

DoctrineBundle的resolve_target_entities仅适用于关系。

您不需要使用它来实际将不同的类(即在两个应用程序中)映射到同一个数据库表。

您应该只使用inheritance mapping

创建由class A(仅在应用程序#1中出现)和class B(仅在应用程序#2中出现)扩展的映射超类class C(存在于两个应用程序中)。