使用服务配置器配置服务
编辑本页警告:您正在浏览的文档欧宝体育电话欧宝娱乐app下载地址Symfony 2.0,现已不再维护。
读本页的更新版本用于Sy欧宝娱乐app下载地址mfony 6.2(当前稳定版本)。
使用服务配置器配置服务
服务配置器是依赖注入容器的一个特性,它允许您在实例化服务后使用可调用对象来配置服务。
您可以在另一个服务、PHP函数或类中的静态方法中指定方法。将服务实例传递给可调用对象,允许配置器在创建服务后执行配置服务所需的任何操作。
例如,当您有一个需要基于来自不同来源/服务的配置设置进行复杂设置的服务时,可以使用服务配置器。使用外部配置器,您可以干净地维护服务实现,并使其与提供所需配置的其他对象解耦。
另一个有趣的用例是,当您有多个对象共享一个公共配置或应该在运行时以类似的方式配置时。
例如,假设您有一个向用户发送不同类型电子邮件的应用程序。电子邮件通过不同的格式化程序传递,这些格式化程序可以根据一些动态应用程序设置启用或不启用。你开始定义一个欧宝app在哪里找NewsletterManager
类是这样的:
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
类欧宝app在哪里找NewsletterManager实现了EmailFormatterAwareInterface{受保护的$梅勒;受保护的$enabledFormatters;公共函数setMailer(梅勒$梅勒){$这->梅勒=$梅勒;}公共函数setEnabledFormatters(数组$enabledFormatters){$这->enabledFormatters =$enabledFormatters;}/ /……}
还有一个GreetingCardManager
类:
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
类GreetingCardManager实现了EmailFormatterAwareInterface{受保护的$梅勒;受保护的$enabledFormatters;公共函数setMailer(梅勒$梅勒){$这->梅勒=$梅勒;}公共函数setEnabledFormatters(数组$enabledFormatters){$这->enabledFormatters =$enabledFormatters;}/ /……}
如前所述,目标是根据应用程序设置在运行时设置格式化程序。要做到这一点,你还需要一个EmailFormatterManager
类,它负责加载和验证应用程序中启用的格式化器:
12 3 4 5 6 7 8 9 10 11 12 13 14 16 17 18 19 20
类EmailFormatterManager{受保护的$enabledFormatters;公共函数loadFormatters(){//代码来配置要使用的格式化程序$enabledFormatters=数组(…);/ /……$这->enabledFormatters =$enabledFormatters;}公共函数getEnabledFormatters(){返回$这->enabledFormatters;}/ /……}
如果你的目标是避免结婚欧宝app在哪里找NewsletterManager
而且GreetingCardManager
与EmailFormatterManager
,然后你可能想要创建一个配置器类来配置这些实例:
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
类EmailConfigurator{私人$formatterManager;公共函数__construct(EmailFormatterManager$formatterManager){$这->formatterManager =$formatterManager;}公共函数配置(EmailFormatterAwareInterface$emailManager){$emailManager->setEnabledFormatters ($这->formatterManager->getEnabledFormatters ());}/ /……}
的EmailConfigurator
的工作是将启用的过滤器注入欧宝app在哪里找NewsletterManager
而且GreetingCardManager
因为他们不知道启用的过滤器来自哪里。另一方面,EmailFormatterManager
保存有关已启用的格式化程序以及如何加载它们的知识,保持单一职责原则。
配置服务配置
上述类的服务配置看起来像这样:
- YAML
- XML
- PHP
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
服务:my_mailer:#……email_formatter_manager:类:EmailFormatterManager#……email_configurator:类:EmailConfigurator参数:[" _formatter_manager "]#……欧宝app在哪里找newsletter_manager:类:欧宝app在哪里找NewsletterManager电话:-[setMailer,[" @my_mailer "]]配置:[" _configurator ",配置)greeting_card_manager:类:GreetingCardManager电话:-[setMailer,[" @my_mailer "]]配置:[" _configurator ",配置)
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
<服务><服务id=“my_mailer”...><!--...-->服务><服务id=“email_formatter_manager”类=“EmailFormatterManager”><!--...-->服务><服务id=“email_configurator”类=“EmailConfigurator”><论点类型=“服务”id=“email_formatter_manager”/><!--...-->服务><服务id=“欧宝app在哪里找newsletter_manager”类=“欧宝app在哪里找NewsletterManager”><调用方法=“setMailer”><论点类型=“服务”id=“my_mailer”/>调用><配置器服务=“email_configurator”方法=“配置”/>服务><服务id=“greeting_card_manager”类=“GreetingCardManager”><调用方法=“setMailer”><论点类型=“服务”id=“my_mailer”/>调用><配置器服务=“email_configurator”方法=“配置”/>服务>服务>
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
使用欧宝娱乐app下载地址\组件\DependencyInjection\定义;使用欧宝娱乐app下载地址\组件\DependencyInjection\参考;/ /……$容器->setDefinition (“my_mailer”,……);$容器->setDefinition (“email_formatter_manager”,新定义(“EmailFormatterManager”));$容器->setDefinition (“email_configurator”,新定义(“EmailConfigurator”));$容器->setDefinition (“欧宝app在哪里找newsletter_manager”,新定义(“欧宝app在哪里找NewsletterManager”))->addMethodCall (“setMailer”,数组(新引用(“my_mailer”)))->setConfigurator (数组(新引用(“email_configurator”),“配置”)));$容器->setDefinition (“greeting_card_manager”,新定义(“GreetingCardManager”))->addMethodCall (“setMailer”,数组(新引用(“my_mailer”)))->setConfigurator (数组(新引用(“email_configurator”),“配置”)));