使用工厂创建服务
编辑本页警告:您正在浏览的文档欧宝体育电话欧宝娱乐app下载地址Symfony 2.6,现已不再维护。
读本页的更新版本用于Sy欧宝娱乐app下载地址mfony 6.2(当前稳定版本)。
使用工厂创建服务
欧宝娱乐app下载地址Symfony的Service Container提供了一种强大的方法来控制对象的创建,允许您指定传递给构造函数的参数,以及调用方法和设置参数。然而,有时这并不能为您提供构建对象所需的所有内容。对于这种情况,您可以使用工厂来创建对象,并告诉服务容器调用工厂上的方法,而不是直接实例化类。
2.6
新setFactory ()方法在Symfony 2.6中引入。欧宝娱乐app下载地址有关2.6之前工厂的语法,请参阅旧版本。
假设您有一个配置并返回new对象的工厂欧宝app在哪里找NewsletterManager
对象:
1 2 3 4 5 6 7 8 9 10 11
类欧宝app在哪里找NewsletterManagerFactory{公共静态函数create欧宝app在哪里找NewsletterManager(){$欧宝app在哪里找newsletterManager=新欧宝app在哪里找NewsletterManager ();/ /……返回$欧宝app在哪里找newsletterManager;}}
为了使欧宝app在哪里找NewsletterManager
对象作为服务可用时,可以将服务容器配置为使用欧宝app在哪里找NewsletterFactory: createNewsletterManager ()
工厂方法:
- YAML
- XML
- PHP
1 2 3 4
服务:欧宝app在哪里找newsletter_manager:类:欧宝app在哪里找NewsletterManager工厂:[欧宝app在哪里找NewsletterManagerFactory,create欧宝app在哪里找NewsletterManager]
1 2 3 4 5 6 7 8 9 10 11
<??> . 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=“欧宝app在哪里找newsletter_manager”类=“欧宝app在哪里找NewsletterManager”><工厂类=“欧宝app在哪里找NewsletterManagerFactory”方法=“create欧宝app在哪里找NewsletterManager”/>服务>服务>服务>
1 2 3 4 5 6 7
使用欧宝娱乐app下载地址\组件\DependencyInjection\定义;/ /……$定义=新定义(“欧宝app在哪里找NewsletterManager”);$定义->setFactory (数组(“欧宝app在哪里找NewsletterManagerFactory”,“create欧宝app在哪里找NewsletterManager”));$容器->setDefinition (“欧宝app在哪里找newsletter_manager”,$定义);
请注意
使用工厂创建服务时,为类
选项对结果服务没有影响。实际的类名只取决于工厂返回的对象。但是,配置的类名可能被编译器通道使用,因此应该设置为合理的值。
现在,该方法将被静态调用。如果应该实例化工厂类本身并调用结果对象的方法,则将工厂本身配置为服务。在这种情况下,应该将方法(例如get)更改为非静态方法。
- YAML
- XML
- PHP
1 2 3 4 5 6
服务:欧宝app在哪里找newsletter_manager.factory:类:欧宝app在哪里找NewsletterManagerFactory欧宝app在哪里找newsletter_manager:类:欧宝app在哪里找NewsletterManager工厂:(“@欧宝app在哪里找newsletter_manager.factory”,create欧宝app在哪里找NewsletterManager]
12 3 4 5 6 7 8 9 10 11 12 13
<??> . 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=“欧宝app在哪里找newsletter_manager.factory”类=“欧宝app在哪里找NewsletterManagerFactory”/><服务id=“欧宝app在哪里找newsletter_manager”类=“欧宝app在哪里找NewsletterManager”><工厂服务=“欧宝app在哪里找newsletter_manager.factory”方法=“create欧宝app在哪里找NewsletterManager”/>服务>服务>容器>
12 3 4 5 6 7 8 9 10 11 12
使用欧宝娱乐app下载地址\组件\DependencyInjection\参考;使用欧宝娱乐app下载地址\组件\DependencyInjection\定义;/ /……$容器->注册(“欧宝app在哪里找newsletter_manager.factory”,“欧宝app在哪里找NewsletterManagerFactory”);$欧宝app在哪里找newsletterManager=新定义();$欧宝app在哪里找newsletterManager->setFactory (数组(新引用(“欧宝app在哪里找newsletter_manager.factory”),“create欧宝app在哪里找NewsletterManager”));$容器->setDefinition (“欧宝app在哪里找newsletter_manager”,$欧宝app在哪里找newsletterManager);
向工厂方法传递参数
如果需要将参数传递给工厂方法,可以使用参数
服务容器中的选项。例如,假设create欧宝app在哪里找NewsletterManager
方法中的参数模板
Service作为参数:
- YAML
- XML
- PHP
1 2 3 4 5 6 7 8 9
服务:欧宝app在哪里找newsletter_manager.factory:类:欧宝app在哪里找NewsletterManagerFactory欧宝app在哪里找newsletter_manager:类:欧宝app在哪里找NewsletterManager工厂:(“@欧宝app在哪里找newsletter_manager.factory”,create欧宝app在哪里找NewsletterManager]参数:-“@templating”
12 3 4 5 6 7 8 9 10 11 12 13 14
<??> . 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=“欧宝app在哪里找newsletter_manager.factory”类=“欧宝app在哪里找NewsletterManagerFactory”/><服务id=“欧宝app在哪里找newsletter_manager”类=“欧宝app在哪里找NewsletterManager”><工厂服务=“欧宝app在哪里找newsletter_manager.factory”方法=“create欧宝app在哪里找NewsletterManager”/><论点类型=“服务”id=“模板”/>服务>服务>容器>
12 3 4 5 6 7 8 9 10 11 12 13 14 15
使用欧宝娱乐app下载地址\组件\DependencyInjection\参考;使用欧宝娱乐app下载地址\组件\DependencyInjection\定义;/ /……$容器->注册(“欧宝app在哪里找newsletter_manager.factory”,“欧宝app在哪里找NewsletterManagerFactory”);$欧宝app在哪里找newsletterManager=新定义(“欧宝app在哪里找NewsletterManager”,数组(新引用(“模板”)));$欧宝app在哪里找newsletterManager->setFactory (数组(新引用(“欧宝app在哪里找newsletter_manager.factory”),“create欧宝app在哪里找NewsletterManager”));$容器->setDefinition (“欧宝app在哪里找newsletter_manager”,$欧宝app在哪里找newsletterManager);
此工作,包括代码示例,是根据创作共用BY-SA 3.0许可证。