psr-discovery / http-factory-implementations
这是一个轻量级的库,通过搜索实现相关接口的知名类列表来发现可用的PSR-17 HTTP Factory实现,并返回找到的第一个实例。
Requires
- php: ^8.1
- psr-discovery/discovery: ^1.1
- psr/http-factory: ^1.0
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3.14
- mockery/mockery: ^1.5
- pestphp/pest: ^2.0
- phpstan/phpstan: ^1.10
- phpstan/phpstan-strict-rules: ^1.5
- rector/rector: ^0.15
- vimeo/psalm: ^5.8
- wikimedia/composer-merge-plugin: ^2.0
README
这是一个轻量级库,通过搜索实现相关接口的知名类列表来发现可用的PSR-17 HTTP Factory实现,并返回找到的第一个实例。
该包是PSR Discovery实用程序套件的一部分,该套件还支持PSR Discovery、PSR-18 HTTP Clients、PSR-14 Event Dispatchers、PSR-11 Containers、PSR-6 Caches和PSR-3 Logs。
这主要是为了包含在希望支持PSR-17 Factories而不需要特定实现或要求用户进行额外配置的SDK等库中。
要求
- PHP 8.1+
- Composer 2.0+
成功发现需要宿主应用程序中存在兼容的实现。此库不会为您安装任何实现。
实现
以下自动发现和实例化的psr/http-factory-implementation
实现:
- guzzlehttp/psr7 ^2.0
- http-interop/http-factory-guzzle ^0.2 | ^1.0
- httpsoft/http-message ^1.0.4
- laminas/laminas-diactoros ^2.0
- nimbly/capsule ^2.0
- nyholm/psr7 ^0.2.2 | ^1.0
- slim/psr7 ^1.0
- tuupola/http-factory ^1.0.2
- typo3/core ^10.1 | ^11.0 | ^12.0
- zendframework/zend-diactoros ^2.0
以下也是可用的模拟实现:
如果您希望看到缺少的特定实现,请提交一个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生产、支持或以其他方式关联的。