psr-discovery/http-factory-implementations

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

1.1.1 2024-03-04 21:31 UTC

This package is auto-updated.

Last update: 2024-09-04 22:32:06 UTC


README

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

该包是PSR Discovery实用程序套件的一部分,该套件还支持PSR DiscoveryPSR-18 HTTP ClientsPSR-14 Event DispatchersPSR-11 ContainersPSR-6 CachesPSR-3 Logs

这主要是为了包含在希望支持PSR-17 Factories而不需要特定实现或要求用户进行额外配置的SDK等库中。

要求

  • PHP 8.1+
  • Composer 2.0+

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

实现

以下自动发现和实例化的psr/http-factory-implementation实现:

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

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

安装

composer require --dev 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-17 UploadedFileFactoryInterface instance
$uploadedFileFactory = Discover::httpUploadedFileFactory();

// Returns a PSR-17 UriFactoryInterface instance
$uriFactory = Discover::httpUriFactory();

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

处理失败

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

示例

use PsrDiscovery\Discover;

$requestFactory = Discover::httpRequestFactory();

if ($requestFactory === null) {
    // No suitable HTTP RequestFactory implementation was discovered.
    // Fall back to a default implementation.
    $requestFactory = new DefaultRequestFactory();
}

单例

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

示例

use PsrDiscovery\Discover;

// $httpResponseFactory1 !== $httpResponseFactory2 (default)
$httpResponseFactory1 = Discover::httpResponseFactory();
$httpResponseFactory2 = Discover::httpResponseFactory();

// $httpResponseFactory1 === $httpResponseFactory2
$httpResponseFactory1 = Discover::httpResponseFactory(singleton: true);
$httpResponseFactory2 = Discover::httpResponseFactory(singleton: true);

模拟优先级

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

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

偏好实现

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

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();

在这种情况下,这将导致如果可用,则 httpRequestFactory() 方法返回首选实现,否则将回退到默认行为。同样,当相关类以类似方式配置时,这也适用于 httpResponseFactory()httpStreamFactory()

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

使用特定实现

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

use PsrDiscovery\Discover;
use PsrDiscovery\Implementations\Psr17\ResponseFactories;

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

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

在这种情况下,这将导致如果可用,则 httpResponseFactory() 方法返回首选实现,否则将返回 null。同样,当相关类以类似方式配置时,这也适用于 httpRequestFactory()httpStreamFactory()

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