使用一个工厂来创建服务
编辑该页面警告:你浏览的文档欧宝体育电话欧宝娱乐app下载地址Symfony 2.3,不再维护。
读这个页面的更新版本Symf欧宝娱乐app下载地址ony 6.3(当前的稳定版本)。
使用一个工厂来创建服务
欧宝娱乐app下载地址Symfony的服务容器提供了一个强大的控制的方式创建对象,允许您指定参数传递给构造函数的调用方法和设置参数。有时,然而,这不会为你提供一切你需要构造对象。对于这种情况,您可以使用一个工厂来创建对象,告诉工厂的服务容器来调用一个方法而不是直接实例化类。
假设您有一个工厂,配置并返回一个新的欧宝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在哪里找NewsletterManagerFactory
工厂类:
1 2 3 4 5
服务:欧宝app在哪里找newsletter_manager:类:欧宝app在哪里找NewsletterManagerfactory_class:欧宝app在哪里找NewsletterManagerFactoryfactory_method:create欧宝app在哪里找NewsletterManager
1 2 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”类=“欧宝app在哪里找NewsletterManager”工厂类=“欧宝app在哪里找NewsletterManagerFactory”工厂方法=“create欧宝app在哪里找NewsletterManager”/ >< /服务>< /容器>
1 2 3 4 5 6 7 8
使用欧宝娱乐app下载地址\组件\DependencyInjection\定义;/ /……美元定义=新定义(“欧宝app在哪里找NewsletterManager”);美元定义- >setFactoryClass (“欧宝app在哪里找NewsletterManagerFactory”);美元定义- >setFactoryMethod (“create欧宝app在哪里找NewsletterManager”);美元容器- >setDefinition (“欧宝app在哪里找newsletter_manager”,美元定义);
请注意
当使用一个工厂来创建服务时,选择的价值类
服务选项对结果没有影响。实际的类名只取决于工厂返回的对象。然而,配置的类名可能使用的编译器,因此应该设置为一个合理的值。
当你指定工厂(通过类来使用factory_class
),将调用静态方法。如果工厂本身应该实例化并调用对象的方法,配置工厂本身作为一种服务。在这种情况下,该方法(如。create欧宝app在哪里找NewsletterManager
非静态)应该改变:
1 2 3 4 5 6 7
服务:欧宝app在哪里找newsletter_manager_factory:类:欧宝app在哪里找NewsletterManagerFactory欧宝app在哪里找newsletter_manager:类:欧宝app在哪里找NewsletterManagerfactory_service:欧宝app在哪里找newsletter_manager_factoryfactory_method:create欧宝app在哪里找NewsletterManager
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
< ?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”/ >< /服务>< /容器>
1 2 3 4 5 6 7 8 9 10 11 12
使用欧宝娱乐app下载地址\组件\DependencyInjection\定义;美元容器- >setDefinition (“欧宝app在哪里找newsletter_manager_factory”,新定义(“欧宝app在哪里找NewsletterManager”));美元容器- >setDefinition (“欧宝app在哪里找newsletter_manager”,新定义(“欧宝app在哪里找NewsletterManagerFactory”))- >setFactoryService (“欧宝app在哪里找newsletter_manager_factory”)- >setFactoryMethod (“create欧宝app在哪里找NewsletterManager”);
请注意
工厂服务通过其id指定名称,而不是服务本身的引用。所以,你不需要使用@
语法这个YAML配置。
通过工厂方法的参数
如果你需要工厂方法传递参数,您可以使用参数
选择服务容器内。例如,假设create欧宝app在哪里找NewsletterManager
方法在前面的例子模板
服务作为一个参数:
1 2 3 4 5 6 7 8 9
服务:欧宝app在哪里找newsletter_manager_factory:类:欧宝app在哪里找NewsletterManagerFactory欧宝app在哪里找newsletter_manager:类:欧宝app在哪里找NewsletterManagerfactory_service:欧宝app在哪里找newsletter_manager_factoryfactory_method:create欧宝app在哪里找NewsletterManager参数:- - - - - -“@templating”
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
< ?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=“模板”/ >< /服务>< /服务>< /容器>
1 2 3 4 5 6 7 8 9 10 11 12 13 14
使用欧宝娱乐app下载地址\组件\DependencyInjection\定义;/ /……美元容器- >setDefinition (“欧宝app在哪里找newsletter_manager_factory”,新定义(“欧宝app在哪里找NewsletterManagerFactory”));美元容器- >setDefinition (“欧宝app在哪里找newsletter_manager”,新定义(“欧宝app在哪里找NewsletterManager”,数组(新引用(“模板”))))- >setFactoryService (“欧宝app在哪里找newsletter_manager_factory”)- >setFactoryMethod (“create欧宝app在哪里找NewsletterManager”);
这项工作,包括代码示例,许可下Creative Commons冲锋队3.0许可证。