如何管理与父服务的共同依赖关系

编辑本页

警告:您正在浏览的文档欧宝官网下载appob娱乐下载Symfony 4.1,现已不再维护。

本页的更新版本用于Syob娱乐下载mfony 6.2(当前稳定版本)。

如何管理与父服务的共同依赖关系

当您向应用程序添加更多功能时,您很可能开始拥有共享一些相同依赖项的相关类。例如,您可能有多个存储库类需要doctrine.orm.entity_manager服务和可选的日志记录器服务:

12 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(ObjectManagerobjectManager->objectManager =objectManager;}公共函数setLogger(LoggerInterface日志记录器->记录器=日志记录器;}/ /……

您的儿童服务课程可能是这样的:

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

就像你使用PHP继承来避免PHP代码中的重复一样,服务容器允许你扩展父服务以避免重复的服务定义:

  • YAML
  • XML
  • PHP
12 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\ basedoctrinrepository服务家长:App \ Repository \ BaseDoctrineRepositoryApp \ Repository \ DoctrinePostRepository:家长:App \ Repository \ BaseDoctrineRepository#……

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

父服务上的所有属性都与子服务共享除了共享摘要而且标签.这些都是继承自父类。

请注意

如果你有_defaults节中,所有子服务都需要显式覆盖这些值以避免歧义。您将看到一条明确的错误消息。

提示

在所显示的示例中,共享相同配置的类也从PHP中的相同父类扩展而来。这完全没有必要。您还可以将类似服务定义的公共部分提取到父服务中,而无需在PHP中扩展父类。

重写父依赖关系

有时您可能想要重写仅为一个子服务注入的服务。你可以通过在子类中指定它来覆盖大多数设置:

  • YAML
  • XML
  • PHP
12 3 4 5 6 7 8 9 10 11 12 13 14 16 17 18 19 20
#配置/ services.yaml服务:#……App \ Repository \ DoctrineUserRepository:家长:App \ Repository \ BaseDoctrineRepository#覆盖父服务的公共设置公众:#追加@应用程序。使用rname_checker' argument to the parent#参数列表参数:(“@app.username_checker”)App \ Repository \ DoctrinePostRepository:家长:App \ Repository \ BaseDoctrineRepository#覆盖第一个参数(使用特殊的index_N键)参数:index_0:“@doctrine.custom_entity_manager”
此工作,包括代码示例,是根据创作共用BY-SA 3.0许可证。