类型的注入

编辑该页面

类型的注入

是类的依赖关系明确,要求他们被注入到这是一个好方法使一个类更可重用,可测试和与他人。

有几种方法可以被注入的依赖关系。每个注入点需要考虑有其优点和缺点,以及不同的工作方式和他们在使用服务容器。

构造函数注入

最常见的方式是通过一个类的构造函数注入依赖项。要做到这一点,你需要添加一个构造函数的参数签名接受依赖:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
/ / src /邮件/欧宝app在哪里找 NewsletterManager.php名称空间应用程序\邮件;/ /……欧宝app在哪里找NewsletterManager{私人美元梅勒;公共函数__construct(MailerInterface美元梅勒){美元- >梅勒=美元梅勒;}/ /……}

您可以指定什么服务你想注入到这个服务容器中配置:

  • YAML
  • XML
  • PHP
1 2 3 4 5 6
#配置/ services.yaml服务:#……邮件\ App \欧宝app在哪里找 NewsletterManager:参数:(“@mailer”)

提示

类型提示注入的对象意味着您可以确定一个合适的依赖注入。通过类型提示,你将会得到一个明确的错误立即如果一个不合适的依赖注入。通过类型提示使用一个接口而不是一个类你可以依赖的选择更加灵活。假设你只使用接口中定义的方法,你仍然可以获得灵活性和安全使用的对象。

使用构造函数注入有几个优势:

  • 如果需要依赖和类的工作离不开它然后通过构造函数注入它确保时存在阶级作为阶级不能没有它了。
  • 构造函数只能被称为一旦创建对象时,你可以确定依赖对象的生命周期期间不会改变。

这些优势意味着构造函数注入不适合使用可选的依赖性。也更难使用结合类层次结构:如果一个类使用构造函数注入然后扩展和覆盖构造函数就有问题。

Immutable-setter注入

注入另一个可能是使用一个方法返回一个单独的实例通过克隆原始服务,这种方法允许您服务不变的:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21日22日23日24
/ / src /邮件/欧宝app在哪里找 NewsletterManager.php名称空间应用程序\邮件;/ /……使用欧宝娱乐app下载地址\组件\梅勒\MailerInterface;欧宝app在哪里找NewsletterManager{私人美元梅勒;/ * * *@ required*@return静态* /公共函数withMailer(MailerInterface美元梅勒):自我{美元=克隆美元;美元- >梅勒=美元梅勒;返回美元;}/ /……}

为了使用这种类型的注入,别忘了配置:

  • YAML
  • XML
  • PHP
1 2 3 4 5 6 7 8
#配置/ services.yaml服务:#……app.欧宝app在哪里找newsletter_manager:类:应用\ \ New欧宝app在哪里找sletterManager邮件电话:- - - - - -withMailer:returns_clone !(“@mailer”)

请注意

如果你决定使用自动装配,这种类型的注入要求你添加一个@return静态docblock为了容器能够注册方法。

这种方法是有用的,如果您需要配置您的服务根据您的需求,所以,immutable-setters的优点:

  • 不可变的setter与可选的依赖关系,这样,如果你不需要一个依赖,setter不需要。
  • 构造函数注入,使用不可变的setter迫使依赖服务的生命周期期间保持不变。
  • 这种类型的注入作品特征作为服务可以组合,这种方式,适应您的应用程序需求的服务是容易。
  • setter可以调用多次,这种方式,添加一个依赖项集合变得容易,并允许您添加一个变量的依赖关系。

缺点是:

  • setter称为是可选的,一个依赖服务的调用方法时可以为空。你必须在使用前检查依赖关系可用。
  • 除非服务声明懒惰,这是不符合服务引用对方所谓的循环回路。

Setter注入

另一个可能的注入点到一个类是通过添加setter方法,它接受的依赖:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
/ / src /邮件/欧宝app在哪里找 NewsletterManager.php名称空间应用程序\邮件;/ /……欧宝app在哪里找NewsletterManager{私人美元梅勒;/ * * *@ required* /公共函数setMailer(MailerInterface美元梅勒):无效{美元- >梅勒=美元梅勒;}/ /……}
  • YAML
  • XML
  • PHP
1 2 3 4 5 6 7 8
#配置/ services.yaml服务:#……app.欧宝app在哪里找newsletter_manager:类:应用\ \ New欧宝app在哪里找sletterManager邮件电话:- - - - - -setMailer:(“@mailer”)

这次的优势有:

  • Setter注入作品与可选的依赖性。如果你不需要依赖,那么不要调用setter。
  • 你可以多次调用setter。这是特别有用如果将依赖项添加到集合的方法。你可以有一个变量数量的依赖关系。
  • 像immutable-setter,这种类型的注入作品特征和允许您编写服务。

setter注入的缺点是:

  • setter可以被称为不止一次,也初始化之后很久,所以你不能确定依赖不是取代在对象的生命周期(除了通过显式编写setter方法来检查如果它已被称为)。
  • 你不能确定将调用setter,所以您需要添加检查任何所需的依赖项注入。

属性注入

另一种可能性是直接设置类的公共字段:

1 2 3 4 5 6 7
/ /……欧宝app在哪里找NewsletterManager{公共美元梅勒;/ /……}
  • YAML
  • XML
  • PHP
1 2 3 4 5 6 7 8
#配置/ services.yaml服务:#……app.欧宝app在哪里找newsletter_manager:类:应用\ \ New欧宝app在哪里找sletterManager邮件属性:梅勒:“@mailer”

主要有唯一的缺点使用属性注入,它类似于setter注入,但是这些额外的重要问题:

  • 你不能控制依赖组时,它可以在任何时候改变对象的生命周期。
  • 您不能使用类型提示,因此你不能确定什么是依赖除了写作注入类代码来显式地在使用前测试类实例。

但是,知道这是很有用的可以用服务容器,特别是如果你正在与代码的控制,例如在一个第三方库,它使用公共属性的依赖关系。

这项工作,包括代码示例,许可下Creative Commons冲锋队3.0许可证。
欧宝娱乐app下载地址Symfony 6.2支持通过苏禄人
欧宝娱乐app下载地址Symfony 6.2支持通过Les-Tilleuls.coop