psr-discovery/container-implementations

这是一个轻量级库,通过搜索一组已知的实现相关接口的类来发现可用的PSR-11容器实现,并返回找到的第一个实例。

1.1.1 2024-03-04 21:24 UTC

This package is auto-updated.

Last update: 2024-09-04 22:18:28 UTC


README

这是一个轻量级库,通过搜索一组已知的实现相关接口的类来发现可用的PSR-11 容器实现,并返回找到的第一个实例。

此包是PSR Discovery实用工具套件的一部分,该套件还支持PSR DiscoveryPSR-18 HTTP 客户端PSR-17 HTTP 工厂PSR-14 事件调度器PSR-6 缓存PSR-3 日志

此库主要用于包含在希望支持PSR-11容器而不需要依赖特定实现或要求用户进行额外配置的SDK等库中。

要求

  • PHP 8.1+
  • Composer 2.0+

成功发现需要宿主应用程序中存在兼容的实现。此库不会为您安装任何实现。

实现

以下自动发现并实例化的psr/container-implementation实现:

以下也是可用的模拟实现:

如果您缺少特定的实现,并希望添加支持,请提交一个pull request。

安装

composer require psr-discovery/container-implementations

使用

use PsrDiscovery\Discover;

// Return an instance of the first discovered PSR-11 Container implementation.
$container = Discover::container();

$container->get(...)

处理失败

如果库无法发现合适的PSR-11实现,则Discover::container()发现方法将简单地返回null。这允许您优雅地处理失败,例如回退到默认实现。

示例

use PsrDiscovery\Discover;

$container = Discover::container();

if ($container === null) {
    // No suitable Container implementation was discovered.
    // Fall back to a default implementation.
    $container = new DefaultContainer();
}

单例

默认情况下,Discover::container()方法将始终返回找到的实现的新实例。如果您希望使用单例实例,只需将true传递给发现方法的$singleton参数。

示例

use PsrDiscovery\Discover;

// $container1 !== $container2 (default)
$container1 = Discover::container();
$container2 = Discover::container();

// $container1 === $container2
$container1 = Discover::container(singleton: true);
$container2 = Discover::container(singleton: true);

模拟优先级

此库将优先搜索已知、可用的模拟库,然后再搜索实际实现。这是为了便于测试使用此库的代码。

预期这些模拟库将始终作为开发依赖项安装,因此如果它们可用,则建议使用。

偏袒某个实现

如果您希望优先使用特定实现而不是其他实现,可以通过包名prefer()它。

use PsrDiscovery\Discover;
use PsrDiscovery\Implementations\Psr11\Containers;

// Prefer the a specific implementation of PSR-11 over others.
Containers::prefer('league/container');

// Return an instance of League\Container\Container,
// or the next available from the list of candidates,
// Returns null if none are discovered.
$container = Discover::container();

这会导致container()方法返回可用的首选实现,否则将回退到默认行为。

请注意,分配首选实现将使其优先于模拟库的默认偏好。

使用特定实现

如果您想强制使用特定实现并忽略其他发现候选者,您可以使用其包名use()

use PsrDiscovery\Discover;
use PsrDiscovery\Implementations\Psr11\Containers;

// Only discover a specific implementation of PSR-11.
Containers::use('league/container');

// Return an instance of League\Container\Container,
// or null if it is not available.
$container = Discover::container();

如果可用,这将导致container()方法返回首选实现,否则将返回null

本库不是由PHP-FIG生产、推荐或以其他方式关联的。