如何管理共同依赖父母服务

编辑该页面

警告:你浏览的文档欧宝体育电话欧宝娱乐app下载地址Symfony 5.2,不再维护。

这个页面的更新版本Symf欧宝娱乐app下载地址ony 6.2(当前的稳定版本)。

如何管理共同依赖父母服务

当你将更多的功能添加到您的应用程序,你可能会开始有相关类,有一些相同的依赖关系。例如,您可能需要有多个库类doctrine.orm.entity_manager服务和一个可选的日志记录器服务:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21日22日23日24
/ / src /仓库/ BaseDoctrineRepository.php名称空间应用程序\存储库;使用学说\持久性\ObjectManager;使用Psr\日志\LoggerInterface;/ /……文摘BaseDoctrineRepository{受保护的美元objectManager;受保护的美元日志记录器;公共函数__construct(ObjectManager美元objectManager){美元- >objectManager =美元objectManager;}公共函数setLogger(LoggerInterface美元日志记录器):无效{美元- >记录器=美元日志记录器;}/ /……}

你的孩子服务类看起来像这样:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
/ / src /仓库/ DoctrineUserRepository.php名称空间应用程序\存储库;使用应用程序\存储库\BaseDoctrineRepository;/ /……DoctrineUserRepository扩展BaseDoctrineRepository{/ /……}/ / src /仓库/ DoctrinePostRepository.php名称空间应用程序\存储库;使用应用程序\存储库\BaseDoctrineRepository;/ /……DoctrinePostRepository扩展BaseDoctrineRepository{/ /……}

服务容器允许你扩展父服务为了避免重复服务定义:

  • YAML
  • XML
  • PHP
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
#配置/ services.yaml服务:App \ Repository \ BaseDoctrineRepository:文摘:真正的参数:(“@doctrine.orm.entity_manager”)电话:- - - - - -setLogger:(“@logger”)App \ Repository \ DoctrineUserRepository:# \ Repository \ BaseDoctrineRepository扩展应用服务家长:App \ Repository \ BaseDoctrineRepositoryApp \ Repository \ DoctrinePostRepository:家长:App \ Repository \ BaseDoctrineRepository#……

在这种背景下,有一个服务意味着父母的参数和方法调用服务应该用于孩子服务。具体来说,EntityManager将注射,setLogger ()时将调用App \ Repository \ DoctrineUserRepository被实例化。

所有属性在父母与孩子共享服务除了共享,文摘标签。这些都是继承了父母。

提示

所示的例子中,类共享相同的配置也从相同的父类的PHP扩展。这是没有必要的。你也可以提取公共部分类似的服务定义为父母服务没有还在PHP扩展父类。

压倒一切的父母依赖

可能会有时间,你想覆盖服务注入仅供一个孩子服务。你可以覆盖大部分设置通过指定的子类:

  • YAML
  • XML
  • PHP
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
#配置/ services.yaml服务:#……App \ Repository \ DoctrineUserRepository:家长:App \ Repository \ BaseDoctrineRepository#覆盖父的私人设置服务公众:真正的#附加“@app。使用rname_checker' argument to the parent< /span>#参数列表参数:(“@app.username_checker”)App \ Repository \ DoctrinePostRepository:家长:App \ Repository \ BaseDoctrineRepository#覆盖第一个参数(使用特殊index_N键)参数:index_0:“@doctrine.custom_entity_manager”
这项工作,包括代码示例,许可下Creative Commons冲锋队3.0许可证。