psr-discovery/http-client-implementations

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

1.2.0 2024-03-16 05:29 UTC

This package is auto-updated.

Last update: 2024-09-16 06:38:02 UTC


README

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

此包是PSR Discovery实用工具套件的一部分,该套件还支持PSR-17 HTTP FactoriesPSR-14 Event DispatchersPSR-11 ContainersPSR-6 CachesPSR-3 Logs

此库主要用于包含在希望支持PSR-18 HTTP客户端而不需要特定实现的硬依赖或要求用户进行额外配置的库(如SDK)中。

要求

  • PHP 8.1+
  • Composer 2.0+

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

实现

以下自动发现并实例化的psr/http-client-implementation实现

以下也是可用的模拟实现

如果您希望看到缺少的特定实现(如需添加支持,请提交pull request),请提交。

安装

composer require psr-discovery/http-client-implementations

使用

use PsrDiscovery\Discover;

// Return an instance of the first discovered PSR-18 HTTP Client implementation.
$httpClient = Discover::httpClient();

// Send a request using the discovered HTTP Client.
$httpClient->sendRequest(...);

处理失败

如果库无法发现合适的PSR-18实现,则Discover::httpClient()发现方法将直接返回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();
}

单例

默认情况下,Discover::httpClient()方法将始终返回发现实现的全新实例。如果您希望使用单例实例,只需将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);

模拟优先级

此库在搜索已知、可用的模拟库之前会优先搜索真实实现。这是为了便于测试使用此库的代码。

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

优先选择实现

如果您想优先选择某个特定实现而不是其他实现,您可以通过包名来prefer()它。

use PsrDiscovery\Discover;
use PsrDiscovery\Implementations\Psr18\Clients;

// Prefer the a specific implementation of PSR-18 over others.
Clients::prefer('guzzlehttp/guzzle');

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

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

请注意,指定首选实现将使它优先于模拟库的默认偏好设置。

使用特定实现

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

use PsrDiscovery\Discover;
use PsrDiscovery\Implementations\Psr18\Clients;

// Only discover a specific implementation of PSR-18.
Clients::use('guzzlehttp/guzzle');

// Return an instance of GuzzleHttp\Client,
// or null if it is not available.
$client = Discover::httpClient();

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

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