psr-discovery / http-client-implementations
轻量级库,通过搜索实现相关接口的知名类列表来发现可用的PSR-18 HTTP客户端实现,并返回找到的第一个实例。
Requires
- php: ^8.1
- psr-discovery/discovery: ^1.0
- psr/http-client: ^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-18 HTTP客户端实现,并返回找到的第一个实例。
此包是PSR Discovery实用工具套件的一部分,该套件还支持PSR-17 HTTP Factories、PSR-14 Event Dispatchers、PSR-11 Containers、PSR-6 Caches和PSR-3 Logs。
此库主要用于包含在希望支持PSR-18 HTTP客户端而不需要特定实现的硬依赖或要求用户进行额外配置的库(如SDK)中。
要求
- PHP 8.1+
- Composer 2.0+
成功发现需要主机应用程序中存在兼容的实现。此库不会为您安装任何实现。
实现
以下自动发现并实例化的psr/http-client-implementation
实现
- guzzlehttp/guzzle ^7.0
- joomla/http ^2.0 | ^3.0
- kriswallsmith/buzz ^1.0
- php-http/curl-client ^2.1
- php-http/guzzle5-adapter ^2.0
- php-http/guzzle6-adapter ^2.0
- php-http/guzzle7-adapter ^0.1 | ^1.0
- php-http/socket-client ^2.0
- symfony/http-client ^4.3 | ^5.0 | ^6.0 | ^7.0
- voku/httpful ^2.2
以下也是可用的模拟实现
如果您希望看到缺少的特定实现(如需添加支持,请提交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生产、推荐或以其他方式关联的。