使用工厂创建服务

编辑本页

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

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

使用工厂创建服务

ob娱乐下载Symfony的Service Container提供了一种强大的方法来控制对象的创建,允许您指定传递给构造函数的参数,以及调用方法和设置参数。然而,有时这并不能为您提供构建对象所需的所有内容。对于这种情况,您可以使用工厂来创建对象,并告诉服务容器调用工厂上的方法,而不是直接实例化类。

假设您有一个配置并返回new对象的工厂欧宝平台是合法的吗NewsletterManager对象:

1 2 3 4 5 6 7 8 9 10 11
欧宝平台是合法的吗NewsletterManagerFactory公共静态函数create欧宝平台是合法的吗NewsletterManager()欧宝平台是合法的吗newsletterManager欧宝平台是合法的吗NewsletterManager ();/ /……返回欧宝平台是合法的吗newsletterManager;}}

为了使欧宝平台是合法的吗NewsletterManager对象作为服务可用时,可以将服务容器配置为使用欧宝平台是合法的吗NewsletterManagerFactory工厂类:

  • YAML
  • XML
  • PHP
1 2 3 4 5
服务:欧宝平台是合法的吗newsletter_manager:类:欧宝平台是合法的吗NewsletterManagerfactory_class:欧宝平台是合法的吗NewsletterManagerFactoryfactory_method:create欧宝平台是合法的吗NewsletterManager

请注意

使用工厂创建服务时,为选项对结果服务没有影响。实际的类名只取决于工厂返回的对象。但是,配置的类名可能被编译器通道使用,因此应该设置为合理的值。

当您为工厂指定要使用的类时(通过factory_class)该方法将被静态调用。如果应该实例化工厂本身并调用结果对象的方法,则将工厂本身配置为服务。在这种情况下,方法(例如。create欧宝平台是合法的吗NewsletterManager)应改为非静态:

  • YAML
  • XML
  • PHP
1 2 3 4 5 6 7
服务:欧宝平台是合法的吗newsletter_manager_factory:类:欧宝平台是合法的吗NewsletterManagerFactory欧宝平台是合法的吗newsletter_manager:类:欧宝平台是合法的吗NewsletterManagerfactory_service:欧宝平台是合法的吗newsletter_manager_factoryfactory_method:create欧宝平台是合法的吗NewsletterManager

请注意

工厂服务由其id名指定,而不是对服务本身的引用。因此,您不需要使用@YAML配置中的语法。

向工厂方法传递参数

如果需要将参数传递给工厂方法,可以使用参数服务容器中的选项。例如,假设create欧宝平台是合法的吗NewsletterManager方法中的参数模板Service作为参数:

  • YAML
  • XML
  • PHP
1 2 3 4 5 6 7 8 9
服务:欧宝平台是合法的吗newsletter_manager_factory:类:欧宝平台是合法的吗NewsletterManagerFactory欧宝平台是合法的吗newsletter_manager:类:欧宝平台是合法的吗NewsletterManagerfactory_service:欧宝平台是合法的吗newsletter_manager_factoryfactory_method:create欧宝平台是合法的吗NewsletterManager参数:-“@templating”
此工作,包括代码示例,是根据创作共用BY-SA 3.0许可证。