我在两个项目( 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
这仅适用于学说关系吗?
答案 0 :(得分:1)
DoctrineBundle的resolve_target_entities
仅适用于关系。
您不需要使用它来实际将不同的类(即在两个应用程序中)映射到同一个数据库表。
您应该只使用inheritance mapping。
创建由class A
(仅在应用程序#1中出现)和class B
(仅在应用程序#2中出现)扩展的映射超类class C
(存在于两个应用程序中)。