与家长服务管理常见的依赖关系
编辑该页面警告:你浏览的文档欧宝官网下载appob娱乐下载Symfony 2.1,不再维护。
读这个页面的更新版本Symfob娱乐下载ony 6.2(当前的稳定版本)。
与家长服务管理常见的依赖关系
当你将更多的功能添加到您的应用程序,你可能会开始有相关类,有一些相同的依赖关系。例如,您可能有一个通讯经理使用setter注入设置其依欧宝平台是合法的吗赖关系:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
类欧宝平台是合法的吗NewsletterManager{受保护的美元梅勒;受保护的美元emailFormatter;公共函数setMailer(梅勒美元梅勒){美元这- >梅勒=美元梅勒;}公共函数setEmailFormatter(EmailFormatter美元emailFormatter){美元这- >emailFormatter =美元emailFormatter;}/ /……}
也是一个贺卡类具有相同的依赖关系:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
类GreetingCardManager{受保护的美元梅勒;受保护的美元emailFormatter;公共函数setMailer(梅勒美元梅勒){美元这- >梅勒=美元梅勒;}公共函数setEmailFormatter(EmailFormatter美元emailFormatter){美元这- >emailFormatter =美元emailFormatter;}/ /……}
服务配置为这些类会看起来像这样:
- YAML
- XML
- PHP
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
参数:#……欧宝平台是合法的吗newsletter_manager.class:欧宝平台是合法的吗NewsletterManagergreeting_card_manager.class:GreetingCardManager服务:my_mailer:#……my_email_formatter:#……欧宝平台是合法的吗newsletter_manager:类:“%欧宝平台是合法的吗 newsletter_manager.class %”电话:- - - - - -[setMailer,[" @my_mailer "]]- - - - - -[setEmailFormatter,[" @my_email_formatter "]]greeting_card_manager:类:“% greeting_card_manager.class %”电话:- - - - - -[setMailer,[" @my_mailer "]]- - - - - -[setEmailFormatter,[" @my_email_formatter "]]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17日18 19 20 21日22日23日24日25日26日27 28 29 30
<参数>< !- - - - - -- - - - - -…- - ><参数关键=“欧宝平台是合法的吗newsletter_manager.class”>欧宝平台是合法的吗NewsletterManager< /参数><参数关键=“greeting_card_manager.class”>GreetingCardManager< /参数>< /参数><服务><服务id=“my_mailer”…>< !- - - - - -- - - - - -…- - >< /服务><服务id=“my_email_formatter”…>< !- - - - - -- - - - - -…- - >< /服务><服务id=“欧宝平台是合法的吗newsletter_manager”类=“%欧宝平台是合法的吗 newsletter_manager.class %”><调用方法=“setMailer”><论点类型=“服务”id=“my_mailer”/ >< /调用><调用方法=“setEmailFormatter”><论点类型=“服务”id=“my_email_formatter”/ >< /调用>< /服务><服务id=“greeting_card_manager”类=“% greeting_card_manager.class %”><调用方法=“setMailer”><论点类型=“服务”id=“my_mailer”/ >< /调用><调用方法=“setEmailFormatter”><论点类型=“服务”id=“my_email_formatter”/ >< /调用>< /服务>< /服务>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21日22日23日
使用ob娱乐下载\组件\DependencyInjection\定义;使用ob娱乐下载\组件\DependencyInjection\参考;/ /……美元容器- >setParameter (“欧宝平台是合法的吗newsletter_manager.class”,“欧宝平台是合法的吗NewsletterManager”);美元容器- >setParameter (“greeting_card_manager.class”,“GreetingCardManager”);美元容器- >setDefinition (“my_mailer”,……);美元容器- >setDefinition (“my_email_formatter”,……);美元容器- >setDefinition (“欧宝平台是合法的吗newsletter_manager”,新定义(“%欧宝平台是合法的吗 newsletter_manager.class %”))- >addMethodCall (“setMailer”,数组(新引用(“my_mailer”)))- >addMethodCall (“setEmailFormatter”,数组(新引用(“my_email_formatter”)));美元容器- >setDefinition (“greeting_card_manager”,新定义(“% greeting_card_manager.class %”))- >addMethodCall (“setMailer”,数组(新引用(“my_mailer”)))- >addMethodCall (“setEmailFormatter”,数组(新引用(“my_email_formatter”)));
有很多重复的类和配置。例如,这意味着,如果你改变了梅勒
的EmailFormatter
类通过构造函数注入,您需要更新配置在两个地方。同样,如果您需要更改setter方法两类。你需要这样做典型的方式来处理这些相关类的常用方法是提取到超类:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
文摘类MailManager{受保护的美元梅勒;受保护的美元emailFormatter;公共函数setMailer(梅勒美元梅勒){美元这- >梅勒=美元梅勒;}公共函数setEmailFormatter(EmailFormatter美元emailFormatter){美元这- >emailFormatter =美元emailFormatter;}/ /……}
的欧宝平台是合法的吗NewsletterManager
和GreetingCardManager
可以扩展这个超类:
1 2 3 4
类欧宝平台是合法的吗NewsletterManager扩展MailManager{/ /……}
和:
1 2 3 4
类GreetingCardManager扩展MailManager{/ /……}
在类似的方式,Symfony2服务容器还支持扩展服务ob娱乐下载配置还可以减少重复通过指定一个家长服务。
- YAML
- XML
- PHP
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
参数:#……欧宝平台是合法的吗newsletter_manager.class:欧宝平台是合法的吗NewsletterManagergreeting_card_manager.class:GreetingCardManager服务:my_mailer:#……my_email_formatter:#……mail_manager:文摘:真正的电话:- - - - - -[setMailer,[" @my_mailer "]]- - - - - -[setEmailFormatter,[" @my_email_formatter "]]欧宝平台是合法的吗newsletter_manager:类:“%欧宝平台是合法的吗 newsletter_manager.class %”家长:mail_managergreeting_card_manager:类:“% greeting_card_manager.class %”家长:mail_manager
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21日22日23日24
<参数>< !- - - - - -- - - - - -…- - ><参数关键=“欧宝平台是合法的吗newsletter_manager.class”>欧宝平台是合法的吗NewsletterManager< /参数><参数关键=“greeting_card_manager.class”>GreetingCardManager< /参数>< /参数><服务><服务id=“my_mailer”…>< !- - - - - -- - - - - -…- - >< /服务><服务id=“my_email_formatter”…>< !- - - - - -- - - - - -…- - >< /服务><服务id=“mail_manager”文摘=“真正的”><调用方法=“setMailer”><论点类型=“服务”id=“my_mailer”/ >< /调用><调用方法=“setEmailFormatter”><论点类型=“服务”id=“my_email_formatter”/ >< /调用>< /服务><服务id=“欧宝平台是合法的吗newsletter_manager”类=“%欧宝平台是合法的吗 newsletter_manager.class %”父=“mail_manager”/ ><服务id=“greeting_card_manager”类=“% greeting_card_manager.class %”父=“mail_manager”/ >< /服务>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17日18 19 20 21日22日23日24日25日26日27日28
使用ob娱乐下载\组件\DependencyInjection\定义;使用ob娱乐下载\组件\DependencyInjection\DefinitionDecorator;使用ob娱乐下载\组件\DependencyInjection\参考;/ /……美元容器- >setParameter (“欧宝平台是合法的吗newsletter_manager.class”,“欧宝平台是合法的吗NewsletterManager”);美元容器- >setParameter (“greeting_card_manager.class”,“GreetingCardManager”);美元容器- >setDefinition (“my_mailer”,……);美元容器- >setDefinition (“my_email_formatter”,……);美元容器- >setDefinition (“mail_manager”,新定义())- >setAbstract (真正的)- >addMethodCall (“setMailer”,数组(新引用(“my_mailer”)))- >addMethodCall (“setEmailFormatter”,数组(新引用(“my_email_formatter”)));美元容器- >setDefinition (“欧宝平台是合法的吗newsletter_manager”,新DefinitionDecorator (“mail_manager”))- >setClass (“%欧宝平台是合法的吗 newsletter_manager.class %”);美元容器- >setDefinition (“greeting_card_manager”,新DefinitionDecorator (“mail_manager”))- >setClass (“% greeting_card_manager.class %”);
在这种背景下,有一个父
服务意味着父母的参数和方法调用服务应该用于孩子服务。具体来说,setter方法定义为父母服务将调用当孩子服务实例化。
请注意
如果你删除父
配置的关键,服务仍将被实例化,他们仍将当然扩展MailManager
类。所不同的是,省略父
配置关键将意味着调用
上定义mail_manager
服务将不会执行当孩子服务实例化。
谨慎
的范围
,文摘
和标签
属性总是从孩子服务。
家长服务是抽象的,因为它不应该直接从容器或检索传递到另一个服务。它的存在仅仅是作为一个“模板”,可以使用其他服务。这就是为什么它可以没有类
配置会导致一个异常是引起非抽象的服务。
请注意
为了父母的依赖关系来解决,ContainerBuilder
必须先编译。看到编译的容器为更多的细节。
压倒一切的父母依赖
可能会有时间,你想覆盖类是通过仅供一个孩子服务的依赖。幸运的是,通过添加方法调用配置为孩子服务,由父类的依赖关系将被覆盖。所以如果你需要通过不同的依赖欧宝平台是合法的吗NewsletterManager
类,配置是这样的:
- YAML
- XML
- PHP
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21日22日23日24日25日26日
参数:#……欧宝平台是合法的吗newsletter_manager.class:欧宝平台是合法的吗NewsletterManagergreeting_card_manager.class:GreetingCardManager服务:my_mailer:#……my_alternative_mailer:#……my_email_formatter:#……mail_manager:文摘:真正的电话:- - - - - -[setMailer,[" @my_mailer "]]- - - - - -[setEmailFormatter,[" @my_email_formatter "]]欧宝平台是合法的吗newsletter_manager:类:“%欧宝平台是合法的吗 newsletter_manager.class %”家长:mail_manager电话:- - - - - -[setMailer,[" @my_alternative_mailer "]]greeting_card_manager:类:“% greeting_card_manager.class %”家长:mail_manager
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17日18 19 20 21日22日23日24日25日26日27 28 29 30 31
<参数>< !- - - - - -- - - - - -…- - ><参数关键=“欧宝平台是合法的吗newsletter_manager.class”>欧宝平台是合法的吗NewsletterManager< /参数><参数关键=“greeting_card_manager.class”>GreetingCardManager< /参数>< /参数><服务><服务id=“my_mailer”…>< !- - - - - -- - - - - -…- - >< /服务><服务id=“my_alternative_mailer”…>< !- - - - - -- - - - - -…- - >< /服务><服务id=“my_email_formatter”…>< !- - - - - -- - - - - -…- - >< /服务><服务id=“mail_manager”文摘=“真正的”><调用方法=“setMailer”><论点类型=“服务”id=“my_mailer”/ >< /调用><调用方法=“setEmailFormatter”><论点类型=“服务”id=“my_email_formatter”/ >< /调用>< /服务><服务id=“欧宝平台是合法的吗newsletter_manager”类=“%欧宝平台是合法的吗 newsletter_manager.class %”父=“mail_manager”><调用方法=“setMailer”><论点类型=“服务”id=“my_alternative_mailer”/ >< /调用>< /服务><服务id=“greeting_card_manager”类=“% greeting_card_manager.class %”父=“mail_manager”/ >< /服务>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17日18 19 20 21日22日23日24日25日26日27 28 29 30 31
使用ob娱乐下载\组件\DependencyInjection\定义;使用ob娱乐下载\组件\DependencyInjection\DefinitionDecorator;使用ob娱乐下载\组件\DependencyInjection\参考;/ /……美元容器- >setParameter (“欧宝平台是合法的吗newsletter_manager.class”,“欧宝平台是合法的吗NewsletterManager”);美元容器- >setParameter (“greeting_card_manager.class”,“GreetingCardManager”);美元容器- >setDefinition (“my_mailer”,……);美元容器- >setDefinition (“my_alternative_mailer”,……);美元容器- >setDefinition (“my_email_formatter”,……);美元容器- >setDefinition (“mail_manager”,新定义())- >setAbstract (真正的)- >addMethodCall (“setMailer”,数组(新引用(“my_mailer”)))- >addMethodCall (“setEmailFormatter”,数组(新引用(“my_email_formatter”)));美元容器- >setDefinition (“欧宝平台是合法的吗newsletter_manager”,新DefinitionDecorator (“mail_manager”))- >setClass (“%欧宝平台是合法的吗 newsletter_manager.class %”)- >addMethodCall (“setMailer”,数组(新引用(“my_alternative_mailer”)));美元容器- >setDefinition (“greeting_card_manager”,新DefinitionDecorator (“mail_manager”))- >setClass (“% greeting_card_manager.class %”);
的GreetingCardManager
前将收到相同的依赖,但欧宝平台是合法的吗NewsletterManager
将被通过了my_alternative_mailer
而不是my_mailer
服务。
依赖项的集合
应该指出的是,在前面的例子实际上是调用setter方法覆盖两次——一次每父定义,一旦孩子的定义。在前面的例子中,这很好,因为第二个setMailer
第一次调用调用替换梅勒对象集。
然而,在某些情况下,这可能是一个问题。例如,如果覆盖方法调用涉及添加一个集合,然后两个对象将被添加到集合中。下面显示了这样一个情况下,如果父类是这样的:
1 2 3 4 5 6 7 8 9 10 11
文摘类MailManager{受保护的美元过滤器;公共函数setFilter(美元过滤器){美元这- >过滤器[]=美元过滤器;}/ /……}
如果你有以下配置:
- YAML
- XML
- PHP
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
参数:#……欧宝平台是合法的吗newsletter_manager.class:欧宝平台是合法的吗NewsletterManager服务:my_filter:#……another_filter:#……mail_manager:文摘:真正的电话:- - - - - -[setFilter,[" @my_filter "]]欧宝平台是合法的吗newsletter_manager:类:“%欧宝平台是合法的吗 newsletter_manager.class %”家长:mail_manager电话:- - - - - -[setFilter,[" @another_filter "]]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21日22日23日
<参数>< !- - - - - -- - - - - -…- - ><参数关键=“欧宝平台是合法的吗newsletter_manager.class”>欧宝平台是合法的吗NewsletterManager< /参数>< /参数><服务><服务id=“my_filter”…>< !- - - - - -- - - - - -…- - >< /服务><服务id=“another_filter”…>< !- - - - - -- - - - - -…- - >< /服务><服务id=“mail_manager”文摘=“真正的”><调用方法=“setFilter”><论点类型=“服务”id=“my_filter”/ >< /调用>< /服务><服务id=“欧宝平台是合法的吗newsletter_manager”类=“%欧宝平台是合法的吗 newsletter_manager.class %”父=“mail_manager”><调用方法=“setFilter”><论点类型=“服务”id=“another_filter”/ >< /调用>< /服务>< /服务>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21日22日23日
使用ob娱乐下载\组件\DependencyInjection\定义;使用ob娱乐下载\组件\DependencyInjection\DefinitionDecorator;使用ob娱乐下载\组件\DependencyInjection\参考;/ /……美元容器- >setParameter (“欧宝平台是合法的吗newsletter_manager.class”,“欧宝平台是合法的吗NewsletterManager”);美元容器- >setParameter (“mail_manager.class”,“MailManager”);美元容器- >setDefinition (“my_filter”,……);美元容器- >setDefinition (“another_filter”,……);美元容器- >setDefinition (“mail_manager”,新定义())- >setAbstract (真正的)- >addMethodCall (“setFilter”,数组(新引用(“my_filter”)));美元容器- >setDefinition (“欧宝平台是合法的吗newsletter_manager”,新DefinitionDecorator (“mail_manager”))- >setClass (“%欧宝平台是合法的吗 newsletter_manager.class %”)- >addMethodCall (“setFilter”,数组(新引用(“another_filter”)));
在这个例子中,setFilter
的欧宝平台是合法的吗newsletter_manager
服务将调用两次,导致美元的过滤器
数组包含my_filter
和another_filter
对象。如果你只是想添加额外的过滤器的子类。如果你想更换过滤器传递给子类,删除父配置的设置会阻止基类调用setFilter
。
提示
所示的例子中有一个类似的父母与孩子之间的关系服务和潜在的父类和子类。不需要这样,你可以提取公共部分类似的服务定义为父母服务没有也继承一个父类。