与家长服务管理常见的依赖关系

编辑该页面

警告:你浏览的文档欧宝官网下载appob娱乐下载Symfony 2.6,不再维护。

这个页面的更新版本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
服务:my_mailer:#……my_email_formatter:#……欧宝平台是合法的吗newsletter_manager:类:欧宝平台是合法的吗NewsletterManager电话:- - - - - -[setMailer,[" @my_mailer "]]- - - - - -[setEmailFormatter,[" @my_email_formatter "]]greeting_card_manager:类:“GreetingCardManager”电话:- - - - - -[setMailer,[" @my_mailer "]]- - - - - -[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;}/ /……}

欧宝平台是合法的吗NewsletterManagerGreetingCardManager可以扩展这个超类:

1 2 3 4
欧宝平台是合法的吗NewsletterManager扩展MailManager{/ /……}

和:

1 2 3 4
GreetingCardManager扩展MailManager{/ /……}

在类似的方式,Symfony服务容器还支持扩展服务配ob娱乐下载置还可以减少重复通过指定一个家长服务。

  • YAML
  • XML
  • PHP
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
#……服务:#……mail_manager:文摘:真正的电话:- - - - - -[setMailer,[" @my_mailer "]]- - - - - -[setEmailFormatter,[" @my_email_formatter "]]欧宝平台是合法的吗newsletter_manager:类:“欧宝平台是合法的吗NewsletterManager”家长:mail_managergreeting_card_manager:类:“GreetingCardManager”家长:mail_manager

在这种背景下,有一个服务意味着父母的参数和方法调用服务应该用于孩子服务。具体来说,setter方法定义为父母服务将调用当孩子服务实例化。

请注意

如果你删除配置的关键,服务仍将被实例化,他们仍将当然扩展MailManager类。所不同的是,省略配置关键将意味着调用上定义mail_manager服务将不会执行当孩子服务实例化。

谨慎

范围,文摘标签属性总是从孩子服务。

家长服务是抽象的,因为它不应该直接从容器或检索传递到另一个服务。它的存在仅仅是作为一个“模板”,可以使用其他服务。这就是为什么它可以没有配置会导致一个异常是引起非抽象的服务。

请注意

为了父母的依赖关系来解决,ContainerBuilder必须先编译。看到编译的容器为更多的细节。

提示

所示的例子中,类共享相同的配置也从相同的父类的PHP扩展。这是没有必要的。你可以提取公共部分类似的服务定义为父母服务没有还在PHP扩展父类。

压倒一切的父母依赖

可能会有时间,你想覆盖类是通过仅供一个孩子服务的依赖。幸运的是,通过添加方法调用配置为孩子服务,由父类的依赖关系将被覆盖。所以如果你需要通过不同的依赖欧宝平台是合法的吗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
#……服务:#……my_alternative_mailer:#……mail_manager:文摘:真正的电话:- - - - - -[setMailer,[" @my_mailer "]]- - - - - -[setEmailFormatter,[" @my_email_formatter "]]欧宝平台是合法的吗newsletter_manager:类:“欧宝平台是合法的吗NewsletterManager”家长:mail_manager电话:- - - - - -[setMailer,[" @my_alternative_mailer "]]greeting_card_manager:类:“GreetingCardManager”家长:mail_manager

GreetingCardManager前将收到相同的依赖,但欧宝平台是合法的吗NewsletterManager将被通过了my_alternative_mailer而不是my_mailer服务。

谨慎

你不能覆盖方法调用。当你定义新方法调用的儿童服务,它会被添加到当前的配置方法调用。这意味着它完美地当setter覆盖当前的属性,但它不正常工作时setter将其添加到现有的数据(例如一个addFilters ()方法)。在这种情况下,唯一的解决办法是扩展父服务和配置服务就像你之前知道这个特性。

这项工作,包括代码示例,许可下Creative Commons冲锋队3.0许可证。