psr-discovery/discovery

这是一个轻量级库,通过搜索实现相关接口的知名类列表来发现可用的PSR实现,并返回找到的第一个实例。

1.1.2 2024-08-09 07:04 UTC

This package is auto-updated.

Last update: 2024-09-09 07:19:13 UTC


README

这是一个轻量级库,通过搜索实现相关接口的知名类列表来发现可用的PSR实现,并返回找到的第一个实例。

该库目前支持PSR-18 HTTP 客户端PSR-17 HTTP 工厂PSR-14 事件调度器PSR-11 容器PSR-6 缓存PSR-3 日志

这主要用于在希望支持PSR接口而不需要特定实现硬依赖或要求用户进行额外配置的库(如SDK)中。

需求

  • PHP 8.1+
  • Composer 2.0+

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

安装

您应该安装以下列表中适当的依赖项,以便为希望获得发现支持的PSR安装依赖项。

元包

psr-discovery/all 元包包括所有发现套件包。如果您正在寻找一站式解决方案,这是您想要的。

安装

composer require psr-discovery/all

请参阅以下部分以获取有关每个包单独使用的更多信息。

PSR-18 HTTP 客户端

安装

composer require psr-discovery/http-client-implementations

用法

use PsrDiscovery\Discover;

$httpClient = Discover::httpClient();

请参阅psr-discovery/http-client-implementations存储库以获取支持的实现列表。如果您希望看到缺少的特定实现,请打开一个拉取请求以添加支持。

PSR-17 HTTP 工厂

安装

composer require psr-discovery/http-factory-implementations

用法

use PsrDiscovery\Discover;

// Returns a PSR-17 RequestFactoryInterface instance
$requestFactory = Discover::httpRequestFactory();

// Returns a PSR-17 ResponseFactoryInterface instance
$responseFactory = Discover::httpResponseFactory();

// Returns a PSR-17 StreamFactoryInterface instance
$streamFactory = Discover::httpStreamFactory();

// Returns a PSR-7 RequestInterface instance
$request = $requestFactory->createRequest('GET', 'https://example.com');

请参阅psr-discovery/http-factory-implementations存储库以获取支持的实现列表。如果您希望看到缺少的特定实现,请打开一个拉取请求以添加支持。

PSR-14 事件调度器

安装

composer require psr-discovery/event-dispatcher-implementations

用法

use PsrDiscovery\Discover;

$eventDispatcher = Discover::eventDispatcher();

请参阅psr-discovery/event-dispatcher-implementations存储库以获取支持的实现列表。如果您希望看到缺少的特定实现,请打开一个拉取请求以添加支持。

PSR-11 容器

安装

composer require psr-discovery/container-implementations

用法

use PsrDiscovery\Discover;

$container = Discover::container();

请参阅psr-discovery/container-implementations存储库以获取支持的实现列表。如果您希望看到缺少的特定实现,请打开一个拉取请求以添加支持。

PSR-6 缓存

安装

composer require psr-discovery/cache-implementations

用法

use PsrDiscovery\Discover;

$cache = Discover::cache();

请参阅psr-discovery/cache-implementations存储库以获取支持的实现列表。如果您希望看到缺少的特定实现,请打开一个拉取请求以添加支持。

PSR-3 日志

安装

composer require psr-discovery/log-implementations

用法

use PsrDiscovery\Discover;

$log = Discover::log();

请参阅 psr-discovery/log-implementations 存储库以获取支持的实现列表。如果您希望看到某个特定实现,请提交一个pull请求以添加对该实现的支持。

处理失败

如果库无法发现合适的实现,相关发现方法将直接返回 null。这允许您优雅地处理失败,例如通过回退到默认实现。

示例

use PsrDiscovery\Discover;

$httpClient = Discover::httpClient();

if ($httpClient === null) {
    // No suitable HTTP Client implementation was discovered.
    // Fall back to a default implementation.
    $httpClient = new DefaultHttpClient();
}

异常

当调用发现方法但所需的支持包未安装时,库将抛出 PsrDiscovery\Exceptions\SupportPackageNotFoundException

单例

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

示例

use PsrDiscovery\Discover;

// $httpClient1 !== $httpClient2 (default)
$httpClient1 = Discover::httpClient();
$httpClient2 = Discover::httpClient();

// $httpClient1 === $httpClient2
$httpClient1 = Discover::httpClient(singleton: true);
$httpClient2 = Discover::httpClient(singleton: true);

优先模拟

此库将优先搜索可用的PSR模拟库,如 psr-mock/http-client-implementationphp-http/mock-client

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

优先实现

如果您希望优先使用特定实现,而不仅仅是其他实现,您可以在任何已安装的发现支持库上使用 prefer()

使用 psr-discovery/http-factories-implementations 的示例

use PsrDiscovery\Discover;
use PsrDiscovery\Implementations\Psr17\RequestFactories;

// Prefer the a specific implementation of PSR-17 over others.
RequestFactories::prefer('nyholm/psr7');

// Return an instance of Nyholm\Psr7\Factory\Psr17Factory,
// or the next available from the list of candidates,
// Returns null if none are discovered.
$factory = Discover::httpRequestFactory();

这将导致发现方法在可用时返回首选实现,否则将回退到默认行为。

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

使用特定实现

如果您希望强制使用特定实现并忽略其他发现候选者,您可以在任何已安装的发现支持库上使用 use()

使用 psr-discovery/http-factories-implementations 的示例

use PsrDiscovery\Discover;
use PsrDiscovery\Implementations\Psr17\RequestFactories;

// Only discover a specific implementation of PSR-17.
RequestFactories::use('nyholm/psr7');

// Return an instance of Nyholm\Psr7\Factory\Psr17Factory,
// or null if it is not available.
$factory = Discover::httpRequestFactory();

这将导致发现方法在可用时返回首选实现,否则将返回 null

此库不是由PHP-FIG制作、推广或以任何方式关联的。