使用一个工厂来创建服务

编辑该页面

警告:你浏览的文档欧宝体育电话欧宝娱乐app下载地址Symfony 4.4,不再维护。

这个页面的更新版本Symf欧宝娱乐app下载地址ony 6.2(当前的稳定版本)。

使用一个工厂来创建服务

欧宝娱乐app下载地址Symfony的服务容器提供多个特性来控制对象的创建,允许您指定参数传递给构造函数的调用方法和设置参数。

然而,有时你需要应用工厂设计模式委托对象创建一些特殊的对象称为“工厂”。在这种情况下,服务容器可以在工厂上调用一个方法来创建对象,而不是直接实例化类。

静态工厂

假设您有一个工厂,配置并返回一个新的欧宝app在哪里找NewsletterManager对象通过调用静态的create欧宝app在哪里找NewsletterManager ()方法:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
/ / src /电子邮件欧宝app在哪里找\ NewsletterManagerStaticFactory.php名称空间应用程序\电子邮件;/ /……欧宝app在哪里找NewsletterManagerStaticFactory{公共静态函数create欧宝app在哪里找NewsletterManager():欧宝app在哪里找NewsletterManager{美元欧宝app在哪里找newsletterManager=欧宝app在哪里找NewsletterManager ();/ /……返回美元欧宝app在哪里找newsletterManager;}}

为了使欧宝app在哪里找NewsletterManager作为服务对象可用,使用工厂选项来定义该方法的类必须被创建对象:

  • YAML
  • XML
  • PHP
1 2 3 4 5 6 7
#配置/ services.yaml服务:#……应用\ \ News欧宝app在哪里找letterManager邮件:#第一个参数是类,第二个参数是静态方法工厂:[' App \电子邮件欧宝app在哪里找\ NewsletterManagerStaticFactory ',“create欧宝app在哪里找NewsletterManager”]

请注意

当使用工厂创建服务,价值选择服务类对结果没有影响。实际的类名只取决于工厂返回的对象。然而,配置的类名可能使用的编译器,因此应该设置为一个合理的值。

非静态的工厂

如果你的工厂是使用常规方法而不是静态配置和创建服务,实例化工厂本身也作为服务。服务容器的配置是这样的:

  • YAML
  • XML
  • PHP
1 2 3 4 5 6 7 8 9 10 11
#配置/ services.yaml服务:#……#第一,创建一个服务工厂应用\ \ News欧宝app在哪里找letterManagerFactory邮件:~#第二,使用工厂服务作为“工厂”的第一个参数#选项和工厂方法作为第二个参数应用\ \ News欧宝app在哪里找letterManager邮件:工厂:(“@App \ \ Ne欧宝app在哪里找wsletterManagerFactory邮件”,“create欧宝app在哪里找NewsletterManager”]

调用工厂

假设你现在改变你的工厂方法__invoke ()所以贵厂服务可以作为一个回调:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
/ / src /电子邮件/ Invokab欧宝app在哪里找leNewsletterManagerFactory.php名称空间应用程序\电子邮件;/ /……Invokable欧宝app在哪里找NewsletterManagerFactory{公共函数__invoke():欧宝app在哪里找NewsletterManager{美元欧宝app在哪里找newsletterManager=欧宝app在哪里找NewsletterManager ();/ /……返回美元欧宝app在哪里找newsletterManager;}}

4.3

服务调用工厂在Symfony 4.3中引入的。欧宝娱乐app下载地址

服务可以通过调用工厂通过省略的方法创建和配置名称:

  • YAML
  • XML
  • PHP
1 2 3 4 5 6 7
#配置/ services.yaml服务:#……应用\ \ News欧宝app在哪里找letterManager邮件:类:应用\ \ News欧宝app在哪里找letterManager邮件工厂:“@App \ \ Ne欧宝app在哪里找wsletterManagerFactory邮件”

通过工厂方法的参数

提示

你的工厂方法的参数autowired的如果启用了为你服务。

如果你需要传递参数到工厂方法可以使用参数选择。例如,假设create欧宝app在哪里找NewsletterManager ()在前面的例子的方法模板服务作为一个参数:

  • YAML
  • XML
  • PHP
1 2 3 4 5 6 7
#配置/ services.yaml服务:#……应用\ \ News欧宝app在哪里找letterManager邮件:工厂:(“@App \ \ Ne欧宝app在哪里找wsletterManagerFactory邮件”,create欧宝app在哪里找NewsletterManager]参数:(“@templating”)
这项工作,包括代码示例,许可下Creative Commons冲锋队3.0许可证。