his/container

服务容器的标准接口。

v0.1.1 2020-04-23 15:57 UTC

This package is auto-updated.

Last update: 2024-08-24 01:08:25 UTC


README

容器接口

本文档描述了依赖注入容器的通用接口。

ContainerInterface设定的目标是标准化框架和库如何使用容器来获取对象和参数(在本文档的其余部分中称为条目)。

本文档中“必须”、“禁止”、“必需”、“应当”、“不应当”、“推荐”、“可能”、“可选”等关键词的用法,应按照RFC 2119进行解释。

本文档中“实现者”一词是指在实际的依赖注入相关库或框架中实现ContainerInterface的人。依赖注入容器(DIC)的使用者称为用户。

规范

1.1 基础知识

  • His\Container\ContainerInterface提供了两个方法:gethas

  • get需要一个强制参数:条目类型。它必须是一个typename。对get的调用必须返回类型实现,如果容器不知道该类型,则抛出异常。对同一类型的连续两次get调用应该返回相同的值。然而,根据实现者设计和/或用户配置,可能返回不同的值,因此用户不应该依赖于在连续两次调用中获取相同的值。虽然ContainerInterfaceget()中只定义了一个强制参数,但实现者可以接受额外的可选参数。

  • has需要一个唯一的参数:条目类型。如果容器知道条目类型,则返回true;如果不知道,则返回false。has($service)返回true并不意味着get($service)不会抛出异常。然而,这意味着get($service)不会抛出NotFoundExceptionInterface异常。

1.2 异常

容器直接抛出的异常必须实现His\Container\Exception\ContainerExceptionInterface

调用get方法并传入一个不存在的service应该抛出His\Container\Exception\NotFoundExceptionInterface异常。

1.3 其他特性

本节描述了可以添加到容器中的其他特性。容器不必须实现这些特性以符合ContainerInterface

1.3.1 委托查找功能

委托查找功能的目标是允许多个容器共享条目。实现此功能的容器可以在其他容器中执行依赖查找。

实现此功能的容器将与其他容器提供更高的互操作性。因此,实现此功能是推荐的。

实现此功能的容器

  • 必须实现ContainerInterface
  • 必须提供一种方式来注册一个委托容器(使用构造函数参数、设置器或任何可能的方式)。委托容器必须实现ContainerInterface。

当容器配置为使用委托容器进行依赖项

  • 对get方法的调用仅应返回容器中的条目。如果条目不是容器的一部分,则应抛出异常(如ContainerInterface请求的)。
  • 对has方法的调用仅应在条目是容器的一部分时返回true。如果条目不是容器的一部分,则应返回false。

重要!默认情况下,应仅在委托容器上执行查找,而不是在容器本身上。

然而,容器允许为特殊条目提供异常情况,并提供一种方法来查找相同的容器(或另一个容器)而不是委托容器。