我在我的一个便携式捆绑包中有一个实体,其中映射了supperclass。我将其扩展到每个单独的项目/网站的真实实体,并在主要项目捆绑中实现其他属性。我正在使用接口和分辨率使用接口来关联实体。到目前为止,这部分的运作完美。
我的DQL查询需要解决该特定实现的实体类,该类别扩展了映射的超类。如果使用接口或映射的超类,我会得到符号错误。但是我不想使用我对超类名称的实现,因为这意味着我必须为每个项目更改便携式捆绑包的存储库代码,这是不可接受的。
其中一个想法是从存储库中的配置中获取ORM映射,并在此处注入正确的类。但是我找不到从配置文件中提取该信息的方法。
另一个更好,一个是创建某种侦听器,这将用真实的东西代替界面。
所以我的问题:有人知道这是否是不解决DQL的通常行为?有人有什么想法,我将如何实施我自己实现决议的代码?
任何信息都将不胜感激。
我假设您将混凝土类设置为参数,您以后在父捆绑包中访问。如果是这样,您可以为该类创建一个存储库(一半从Sylius复制)。
parameters:
acme.repository.something.class: DoctrineORMEntityRepository
// Or your custom repository
services:
acme.manager.something:
alias: doctrine.orm.entity_manager
acme.metadata.something:
class: DoctrineORMMappingClassMetadata
factory_service: acme.manager.something
factory_method: getClassMetadata
arguments:
- %acme.model.something.class%
acme.repository.something:
class: %acme.repository.something.class%
arguments:
- @acme.manager.something
- @acme.metadata.something
然后,您只需使用$this->container->get('acme.repository.something
)调用存储库`
andrej,我的情况相似。您可以在自定义存储库中制作一个设置器方法,该方法设置要在DQL中使用的类名称。然后,您可以在服务声明中使用该设置器方法,并带有呼叫标签。
这是我在邮政回购服务声明中所做的。我希望它有帮助。祝你好运。
<service id="cfs_blog.post_repository"
class="%cfs_blog.post_repository.class%"
factory-service="doctrine.orm.entity_manager"
factory-method="getRepository">
<argument>%cfs_blog.post.class%</argument>
<call method="setUserEntityClass">
<argument>%user_class%</argument>
</call>
</service>