如何使用配置器配置服务

编辑本页

如何使用配置器配置服务

服务配置器是服务容器的一个特性,它允许您在实例化服务后使用可调用对象来配置服务。

例如,当您有一个需要基于来自不同来源/服务的配置设置进行复杂设置的服务时,可以使用服务配置器。使用外部配置器,您可以干净地维护服务实现,并使其与提供所需配置的其他对象解耦。

另一个用例是当您有多个对象共享一个公共配置或应该在运行时以类似的方式配置时。

例如,假设您有一个向用户发送不同类型电子邮件的应用程序。电子邮件通过不同的格式化程序传递,这些格式化程序可以根据一些动态应用程序设置启用或不启用。你开始定义一个欧宝app在哪里找NewsletterManager类是这样的:

12 3 4 5 6 7 8 9 10 11 12 13 14
/ / src /邮件/欧宝app在哪里找 NewsletterManager.php名称空间应用程序邮件欧宝app在哪里找NewsletterManager实现了EmailFormatterAwareInterface私人enabledFormatters公共函数setEnabledFormatters(数组enabledFormatters无效->enabledFormatters =enabledFormatters;}/ /……

还有一个GreetingCardManager类:

12 3 4 5 6 7 8 9 10 11 12 13 14
/ / src /邮件/ GreetingCardManager.php名称空间应用程序邮件GreetingCardManager实现了EmailFormatterAwareInterface私人enabledFormatters公共函数setEnabledFormatters(数组enabledFormatters无效->enabledFormatters =enabledFormatters;}/ /……

如前所述,目标是根据应用程序设置在运行时设置格式化程序。要做到这一点,你还需要一个EmailFormatterManager类,它负责加载和验证应用程序中启用的格式化器:

12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
/ / src /邮件/ EmailFormatterManager.php名称空间应用程序邮件EmailFormatterManager/ /……公共函数getEnabledFormatters()数组//代码来配置要使用的格式化程序enabledFormatters=[…];/ /……返回enabledFormatters;}}

如果你的目标是避免结婚欧宝app在哪里找NewsletterManager而且GreetingCardManagerEmailFormatterManager,然后你可能想要创建一个配置器类来配置这些实例:

12 3 4 5 6 7 8 9 10 11 12 13 14 16 17 18 19 20 21
/ / src /邮件/ EmailConfigurator.php名称空间应用程序邮件EmailConfigurator私人formatterManager公共函数__construct(EmailFormatterManagerformatterManager->formatterManager =formatterManager;}公共函数配置(EmailFormatterAwareInterfaceemailManager无效emailManager->setEnabledFormatters (->formatterManager->getEnabledFormatters ());}/ /……

EmailConfigurator的工作是将已启用的格式化程序注入欧宝app在哪里找NewsletterManager而且GreetingCardManager因为它们不知道启用的格式化程序来自哪里。另一方面,EmailFormatterManager保存有关已启用的格式化程序以及如何加载它们的知识,保持单一职责原则。

提示

虽然本例使用PHP类方法,但配置器可以是任何有效的PHP可调用方法,包括函数、静态方法和服务方法。

使用配置器

方法配置服务配置器配置器选择。如果你在用默认的服务。yaml的配置,所有的类都已经作为服务加载。您所需要做的就是指定配置器

  • YAML
  • XML
  • PHP
12 3 4 5 6 7 8 9 10 11 12 13 14 15
#配置/ services.yaml服务:#……#注册所有4个类为服务,包括App\Mail\EmailConfiguratorApp \:资源:“. . / src / *”#……#覆盖服务设置配置器邮件\ App \欧宝app在哪里找 NewsletterManager:配置:(“@App \ \ EmailConfigurator邮件”,“配置”邮件\ App \ GreetingCardManager:配置:(“@App \ \ EmailConfigurator邮件”,“配置”

服务可以通过可调用配置器进行配置(替换配置()方法__invoke ())通过省略方法名:

  • YAML
  • XML
  • PHP
12 3 4 5 6 7 8 9 10 11 12 13 14 15
#配置/ services.yaml服务:#……#将所有类注册为服务,包括App\Mail\EmailConfiguratorApp \:资源:“. . / src / *”#……#覆盖服务设置配置器邮件\ App \欧宝app在哪里找 NewsletterManager:配置:“@App \ \ EmailConfigurator邮件”邮件\ App \ GreetingCardManager:配置:“@App \ \ EmailConfigurator邮件”

就是这样!当请求应用\ \ New欧宝app在哪里找sletterManager邮件应用\ \ GreetingCardManager邮件服务时,创建的实例将首先传递给EmailConfigurator::配置()方法。

此工作,包括代码示例,是根据创作共用BY-SA 3.0许可证。
欧宝娱乐app下载地址Symfony 5.4支持通过私人Packagist