psr-discovery / discovery
这是一个轻量级库,通过搜索实现相关接口的知名类列表来发现可用的PSR实现,并返回找到的第一个实例。
Requires
- php: ^8.1
- composer/semver: ^3.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实现,并返回找到的第一个实例。
该库目前支持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-implementation
或 php-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制作、推广或以任何方式关联的。