如何使用配置器配置服务
编辑本页警告:您正在浏览的文档欧宝体育电话欧宝娱乐app下载地址Symfony 2.7,现已不再维护。
读本页的更新版本用于Sy欧宝娱乐app下载地址mfony 6.2(当前稳定版本)。
如何使用配置器配置服务
的服务配置器是服务容器的一个特性,它允许您在实例化服务后使用可调用对象来配置服务。
例如,当您有一个需要基于来自不同来源/服务的配置设置进行复杂设置的服务时,可以使用服务配置器。使用外部配置器,您可以干净地维护服务实现,并使其与提供所需配置的其他对象解耦。
另一个用例是当您有多个对象共享一个公共配置或应该在运行时以类似的方式配置时。
例如,假设您有一个向用户发送不同类型电子邮件的应用程序。电子邮件通过不同的格式化程序传递,这些格式化程序可以根据一些动态应用程序设置启用或不启用。你开始定义一个欧宝app在哪里找NewsletterManager
类是这样的:
12 3 4 5 6 7 8 9 10 11 12
类欧宝app在哪里找NewsletterManager实现了EmailFormatterAwareInterface{受保护的$梅勒;受保护的$enabledFormatters;公共函数setEnabledFormatters(数组$enabledFormatters){$这->enabledFormatters =$enabledFormatters;}/ /……}
还有一个GreetingCardManager
类:
12 3 4 5 6 7 8 9 10 11 12
类GreetingCardManager实现了EmailFormatterAwareInterface{受保护的$梅勒;受保护的$enabledFormatters;公共函数setEnabledFormatters(数组$enabledFormatters){$这->enabledFormatters =$enabledFormatters;}/ /……}
如前所述,目标是根据应用程序设置在运行时设置格式化程序。要做到这一点,你还需要一个EmailFormatterManager
类,它负责加载和验证应用程序中启用的格式化器:
12 3 4 5 6 7 8 9 10 11 12 13 14 15
类EmailFormatterManager{/ /……公共函数getEnabledFormatters(){//代码来配置要使用的格式化程序$enabledFormatters=数组(…);/ /……返回$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
保存有关已启用的格式化程序以及如何加载它们的知识,保持单一职责原则。
提示
虽然本例使用PHP类方法,但配置器可以是任何有效的PHP可调用方法,包括函数、静态方法和服务方法。
使用配置器
方法配置服务配置器配置器
选择:
- YAML
- XML
- PHP
12 3 4 5 6 7 8 9 10 11 12 13 14 16 17 18 19 20
# app / config / services.yml服务:app.email_formatter_manager:类:AppBundle \ \ EmailFormatterManager邮件#……app.email_configurator:类:AppBundle \ \ EmailConfigurator邮件参数:(“@app.email_formatter_manager”)#……app.欧宝app在哪里找newsletter_manager:类:AppBundle \ \ N欧宝app在哪里找ewsletterManager邮件参数:(“@mailer”)配置:(“@app.email_configurator”,配置)app.greeting_card_manager:类:AppBundle \ \ GreetingCardManager邮件参数:(“@mailer”)配置:(“@app.email_configurator”,配置)
就是这样!当请求app.欧宝app在哪里找newsletter_manager
或app.greeting_card_manager
服务时,创建的实例将首先传递给EmailConfigurator::配置()
方法。