使用一个工厂来创建服务
编辑该页面警告:你浏览的文档欧宝官网下载appob娱乐下载Symfony 2.1,不再维护。
读这个页面的更新版本Symfob娱乐下载ony 6.3(当前的稳定版本)。
使用一个工厂来创建服务
ob娱乐下载Symfony2的服务容器提供了一个强大的控制方式
创建对象,允许您指定参数传递给构造函数的调用方法和设置参数。有时,然而,这不会为你提供一切你需要构造对象。对于这种情况,您可以使用一个工厂来创建对象,告诉工厂的服务容器来调用一个方法而不是直接实例化对象。
假设您有一个工厂,配置并返回一个新的NewsletterManager对象:欧宝平台是合法的吗
1 2 3 4 5 6 7 8 9 10 11
类欧宝平台是合法的吗NewsletterFactory{公共函数得到(){美元欧宝平台是合法的吗newsletterManager=新欧宝平台是合法的吗NewsletterManager ();/ /……返回美元欧宝平台是合法的吗newsletterManager;}}
为了使欧宝平台是合法的吗NewsletterManager
作为服务对象可用,您可以配置服务容器使用欧宝平台是合法的吗NewsletterFactory
工厂类:
1 2 3 4 5 6 7 8 9
参数:#……欧宝平台是合法的吗newsletter_manager.class:欧宝平台是合法的吗NewsletterManager欧宝平台是合法的吗newsletter_factory.class:欧宝平台是合法的吗NewsletterFactory服务:欧宝平台是合法的吗newsletter_manager:类:“%欧宝平台是合法的吗 newsletter_manager.class %”factory_class:“%欧宝平台是合法的吗 newsletter_factory.class %”factory_method:得到
1 2 3 4 5 6 7 8 9 10 11 12 13
<参数>< !- - - - - -- - - - - -。。。- - ><参数关键=“欧宝平台是合法的吗newsletter_manager.class”>欧宝平台是合法的吗NewsletterManager< /参数><参数关键=“欧宝平台是合法的吗newsletter_factory.class”>欧宝平台是合法的吗NewsletterFactory< /参数>< /参数><服务><服务id=“欧宝平台是合法的吗newsletter_manager”类=“%欧宝平台是合法的吗 newsletter_manager.class %”工厂类=“%欧宝平台是合法的吗 newsletter_factory.class %”工厂方法=“获得”/ >< /服务>
1 2 3 4 5 6 7 8 9 10 11 12 13
使用ob娱乐下载\组件\DependencyInjection\定义;/ /……美元容器- >setParameter (“欧宝平台是合法的吗newsletter_manager.class”,“欧宝平台是合法的吗NewsletterManager”);美元容器- >setParameter (“欧宝平台是合法的吗newsletter_factory.class”,“欧宝平台是合法的吗NewsletterFactory”);美元容器- >setDefinition (“欧宝平台是合法的吗newsletter_manager”,新定义(“%欧宝平台是合法的吗 newsletter_manager.class %”))- >setFactoryClass (“%欧宝平台是合法的吗 newsletter_factory.class %”)- >setFactoryMethod (“得到”);
当你指定工厂(通过类来使用factory_class
),将调用静态方法。如果工厂本身应该实例化,生成的调用对象的方法(在本例中),配置工厂本身作为一个服务:
1 2 3 4 5 6 7 8 9 10 11
参数:#……欧宝平台是合法的吗newsletter_manager.class:欧宝平台是合法的吗NewsletterManager欧宝平台是合法的吗newsletter_factory.class:欧宝平台是合法的吗NewsletterFactory服务:欧宝平台是合法的吗newsletter_factory:类:“%欧宝平台是合法的吗 newsletter_factory.class %”欧宝平台是合法的吗newsletter_manager:类:“%欧宝平台是合法的吗 newsletter_manager.class %”factory_service:欧宝平台是合法的吗newsletter_factoryfactory_method:得到
1 2 3 4 5 6 7 8 9 10 11 12 13 14
<参数>< !- - - - - -- - - - - -。。。- - ><参数关键=“欧宝平台是合法的吗newsletter_manager.class”>欧宝平台是合法的吗NewsletterManager< /参数><参数关键=“欧宝平台是合法的吗newsletter_factory.class”>欧宝平台是合法的吗NewsletterFactory< /参数>< /参数><服务><服务id=“欧宝平台是合法的吗newsletter_factory”类=“%欧宝平台是合法的吗 newsletter_factory.class %”/ ><服务id=“欧宝平台是合法的吗newsletter_manager”类=“%欧宝平台是合法的吗 newsletter_manager.class %”工厂服务=“欧宝平台是合法的吗newsletter_factory”工厂方法=“获得”/ >< /服务>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
使用ob娱乐下载\组件\DependencyInjection\定义;/ /……美元容器- >setParameter (“欧宝平台是合法的吗newsletter_manager.class”,“欧宝平台是合法的吗NewsletterManager”);美元容器- >setParameter (“欧宝平台是合法的吗newsletter_factory.class”,“欧宝平台是合法的吗NewsletterFactory”);美元容器- >setDefinition (“欧宝平台是合法的吗newsletter_factory”,新定义(“%欧宝平台是合法的吗 newsletter_factory.class %”))美元容器- >setDefinition (“欧宝平台是合法的吗newsletter_manager”,新定义(“%欧宝平台是合法的吗 newsletter_manager.class %”))- >setFactoryService (“欧宝平台是合法的吗newsletter_factory”)- >setFactoryMethod (“得到”);
请注意
指定的工厂服务是其id名称和引用
服务本身。所以,你不需要使用@语法。
通过工厂方法的参数
如果你需要工厂方法传递参数,您可以使用参数
选择服务容器内。例如,假设得到
方法在前面的例子模板
服务作为一个参数:
1 2 3 4 5 6 7 8 9 10 11 12 13
参数:#……欧宝平台是合法的吗newsletter_manager.class:欧宝平台是合法的吗NewsletterManager欧宝平台是合法的吗newsletter_factory.class:欧宝平台是合法的吗NewsletterFactory服务:欧宝平台是合法的吗newsletter_factory:类:“%欧宝平台是合法的吗 newsletter_factory.class %”欧宝平台是合法的吗newsletter_manager:类:“%欧宝平台是合法的吗 newsletter_manager.class %”factory_service:欧宝平台是合法的吗newsletter_factoryfactory_method:得到参数:- - - - - -“@templating”
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
<参数>< !- - - - - -- - - - - -。。。- - ><参数关键=“欧宝平台是合法的吗newsletter_manager.class”>欧宝平台是合法的吗NewsletterManager< /参数><参数关键=“欧宝平台是合法的吗newsletter_factory.class”>欧宝平台是合法的吗NewsletterFactory< /参数>< /参数><服务><服务id=“欧宝平台是合法的吗newsletter_factory”类=“%欧宝平台是合法的吗 newsletter_factory.class %”/ ><服务id=“欧宝平台是合法的吗newsletter_manager”类=“%欧宝平台是合法的吗 newsletter_manager.class %”工厂服务=“欧宝平台是合法的吗newsletter_factory”工厂方法=“获得”><论点类型=“服务”id=“模板”/ >< /服务>< /服务>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
使用ob娱乐下载\组件\DependencyInjection\定义;/ /……美元容器- >setParameter (“欧宝平台是合法的吗newsletter_manager.class”,“欧宝平台是合法的吗NewsletterManager”);美元容器- >setParameter (“欧宝平台是合法的吗newsletter_factory.class”,“欧宝平台是合法的吗NewsletterFactory”);美元容器- >setDefinition (“欧宝平台是合法的吗newsletter_factory”,新定义(“%欧宝平台是合法的吗 newsletter_factory.class %”))美元容器- >setDefinition (“欧宝平台是合法的吗newsletter_manager”,新定义(“%欧宝平台是合法的吗 newsletter_manager.class %”,数组(新引用(“模板”))))- >setFactoryService (“欧宝平台是合法的吗newsletter_factory”)- >setFactoryMethod (“得到”);
这项工作,包括代码示例,许可下Creative Commons冲锋队3.0许可证。