使用工厂创建服务
编辑本页警告:您正在浏览的文档欧宝体育电话欧宝娱乐app下载地址Symfony 4.3,现已不再维护。
读本页的更新版本用于Sy欧宝娱乐app下载地址mfony 6.2(当前稳定版本)。
使用工厂创建服务
欧宝娱乐app下载地址Symfony的Service Container提供了多个特性来控制对象的创建,允许您指定传递给构造函数的参数以及调用方法和设置参数。
但是,有时需要应用工厂设计模式将对象创建委托给一些称为“工厂”的特殊对象。在这些情况下,服务容器可以调用工厂上的方法来创建对象,而不是直接实例化类。
静态工厂
假设您有一个配置并返回new对象的工厂欧宝app在哪里找NewsletterManager
对象通过调用静态create欧宝app在哪里找NewsletterManager ()
方法:
1 2 3 4 5 6 7 8 9 10 11
类欧宝app在哪里找NewsletterManagerStaticFactory{公共静态函数create欧宝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”]
12 3 4 5 6 7 8 9 10 11 12 13 14 16 17 18 19 20
<!——config/services.xml——> .xml<??> . xml version="1.0" encoding="UTF-8"<容器xmlns=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services”xmlns: xsi=“http://www.w3.org/2001/XMLSchema-instance”xsi: schemaLocation=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services //www.oldmanjams.com/schema/dic/services/services-1.0.xsd”><服务><服务id=“应用程序\ \ Ne欧宝app在哪里找wsletterManager邮件”><!——第一个参数是类,第二个参数是静态方法——><工厂类=“应用程序\ \ Ne欧宝app在哪里找wsletterManagerStaticFactory邮件”方法=“create欧宝app在哪里找NewsletterManager”/><!——如果工厂类和服务类相同,你可以省略'class'属性,只定义'method'属性: ——>欧宝app在哪里找服务>服务>容器>
12 3 4 5 6 7 8 9 10 11 12 13
/ /配置/ services.php名称空间欧宝娱乐app下载地址\组件\DependencyInjection\加载程序\配置器;使用应用程序\电子邮件\欧宝app在哪里找NewsletterManager;使用应用程序\电子邮件\欧宝app在哪里找NewsletterManagerStaticFactory;返回函数(ContainerConfigurator$配置器){$服务=$配置器->服务();$服务->集(Ne欧宝app在哪里找wsletterManager::类)//第一个参数是类,第二个参数是静态方法->工厂([Newsl欧宝app在哪里找etterManagerStaticFactory::类,“create欧宝app在哪里找NewsletterManager”]);};
请注意
使用工厂创建服务时,为类选择的值对结果服务没有影响。实际的类名只取决于工厂返回的对象。但是,配置的类名可能被编译器通道使用,因此应该设置为合理的值。
非静态的工厂
如果您的工厂正在使用常规方法而不是静态方法来配置和创建服务,那么也要将工厂本身实例化为服务。服务容器的配置如下所示:
- YAML
- XML
- PHP
1 2 3 4 5 6 7 8 9 10 11
#配置/ services.yaml服务:#……#首先,为工厂创建服务应用\ \ News欧宝app在哪里找letterManagerFactory邮件:~#第二,使用factory服务作为factory的第一个参数#选项和工厂方法作为第二个参数应用\ \ News欧宝app在哪里找letterManager邮件:工厂:(“@App \ \ Ne欧宝app在哪里找wsletterManagerFactory邮件”,“create欧宝app在哪里找NewsletterManager”]
12 3 4 5 6 7 8 9 10 11 12 13 14 16 17 18 19 20
<!——config/services.xml——> .xml<??> . xml version="1.0" encoding="UTF-8"<容器xmlns=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services”xmlns: xsi=“http://www.w3.org/2001/XMLSchema-instance”xsi: schemaLocation=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services //www.oldmanjams.com/schema/dic/services/services-1.0.xsd”><服务><!——首先,为工厂创建服务——><服务id=“应用程序\ \ Ne欧宝app在哪里找wsletterManagerFactory邮件”/><!第二,使用工厂服务作为'factory'选项的第一个参数,工厂方法作为第二个参数——><服务id=“应用程序\ \ Ne欧宝app在哪里找wsletterManager邮件”><工厂服务=“应用程序\ \ Ne欧宝app在哪里找wsletterManagerFactory邮件”方法=“create欧宝app在哪里找NewsletterManager”/>服务>服务>容器>
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
/ /配置/ services.php名称空间欧宝娱乐app下载地址\组件\DependencyInjection\加载程序\配置器;使用应用程序\电子邮件\欧宝app在哪里找NewsletterManager;使用应用程序\电子邮件\欧宝app在哪里找NewsletterManagerFactory;返回函数(ContainerConfigurator$配置器){$服务=$配置器->服务();首先,为工厂创建一个服务$服务->集(Ne欧宝app在哪里找wsletterManagerFactory::类);//第二,使用factory服务作为factory的第一个参数//方法和工厂方法作为第二个参数$服务->集(Ne欧宝app在哪里找wsletterManager::类)->工厂([ref (News欧宝app在哪里找letterManagerFactory::类),“create欧宝app在哪里找NewsletterManager”]);};
调用工厂
假设您现在将工厂方法更改为__invoke ()
这样你的工厂服务就可以被用作回调:
1 2 3 4 5 6 7 8 9 10 11
类Invokable欧宝app在哪里找NewsletterManagerFactory{公共函数__invoke(){$欧宝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邮件”
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16
<!——config/services.xml——> .xml<??> . xml version="1.0" encoding="UTF-8"<容器xmlns=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services”xmlns: xsi=“http://www.w3.org/2001/XMLSchema-instance”xsi: schemaLocation=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services //www.oldmanjams.com/schema/dic/services/services-1.0.xsd”><服务><!——……--><服务id=“应用程序\ \ Ne欧宝app在哪里找wsletterManager邮件”类=“应用程序\ \ Ne欧宝app在哪里找wsletterManager邮件”><工厂服务=“应用程序\ \ Ne欧宝app在哪里找wsletterManagerFactory邮件”/>服务>服务>容器>
12 3 4 5 6 7 8 9 10 11 12 13
/ /配置/ services.php名称空间欧宝娱乐app下载地址\组件\DependencyInjection\加载程序\配置器;使用应用程序\电子邮件\欧宝app在哪里找NewsletterManager;使用应用程序\电子邮件\欧宝app在哪里找NewsletterManagerFactory;返回函数(ContainerConfigurator$配置器){$服务=$配置器->服务();$服务->集(Ne欧宝app在哪里找wsletterManager::类)->args (ref (“模板”)))->工厂(ref (News欧宝app在哪里找letterManagerFactory::类));};
向工厂方法传递参数
提示
工厂方法的参数为autowired的如果你的服务启用了。
如果需要将参数传递给工厂方法,可以使用参数
选择。例如,假设create欧宝app在哪里找NewsletterManager ()
方法中的参数为模板
Service作为参数:
- YAML
- XML
- PHP
1 2 3 4 5 6 7
#配置/ services.yaml服务:#……应用\ \ News欧宝app在哪里找letterManager邮件:工厂:(“@App \ \ Ne欧宝app在哪里找wsletterManagerFactory邮件”,create欧宝app在哪里找NewsletterManager]参数:(“@templating”)
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16
<!——config/services.xml——> .xml<??> . xml version="1.0" encoding="UTF-8"<容器xmlns=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services”xmlns: xsi=“http://www.w3.org/2001/XMLSchema-instance”xsi: schemaLocation=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services //www.oldmanjams.com/schema/dic/services/services-1.0.xsd”><服务><!——……--><服务id=“应用程序\ \ Ne欧宝app在哪里找wsletterManager邮件”><工厂服务=“应用程序\ \ Ne欧宝app在哪里找wsletterManagerFactory邮件”方法=“create欧宝app在哪里找NewsletterManager”/><论点类型=“服务”id=“模板”/>服务>服务>容器>
12 3 4 5 6 7 8 9 10 11 12 13 14
/ /配置/ services.php名称空间欧宝娱乐app下载地址\组件\DependencyInjection\加载程序\配置器;使用应用程序\电子邮件\欧宝app在哪里找NewsletterManager;使用应用程序\电子邮件\欧宝app在哪里找NewsletterManagerFactory;返回函数(ContainerConfigurator$配置器){$服务=$配置器->服务();$服务->集(Ne欧宝app在哪里找wsletterManager::类)->工厂([ref (News欧宝app在哪里找letterManagerFactory::类),“create欧宝app在哪里找NewsletterManager”])->args (ref (“模板”)));};