psr-discovery / log-implementations
这是一个轻量级库,通过搜索实现相关接口的知名类列表,来发现可用的PSR-3日志实现,并返回找到的第一个实例。
Requires
- php: ^8.1
- psr-discovery/discovery: ^1.0
- psr/log: ^1.0 | ^2.0 | ^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-3日志实现,并返回找到的第一个实例。
该软件包是PSR Discovery实用程序套件的一部分,该套件还支持PSR-18 HTTP客户端、PSR-17 HTTP工厂、PSR-14事件调度器、PSR-11容器和PSR-6缓存。
这主要用于包含在SDK等库中,这些库希望支持PSR-3日志,而无需对特定实现有严格依赖或要求用户进行额外配置。
要求
- PHP 8.1+
- Composer 2.0+
成功发现需要宿主应用程序中存在兼容的实现。此库不会为您安装任何实现。
实现
以下自动发现并实例化的 psr/log-implementation
实现:
- apix/log ^1.0
- graylog2/gelf-php ^1.2 | ^2.0
- laminas/laminas-log ^2.9
- yiisoft/log ^1.0 | ^2.0
以下实现可以被发现,但需要手动实例化,因为它们的配置要求:
- google/cloud-logging ^1.22.1
- monolog/monolog ^1.11 | ^2.0 | ^3.0
- neos/flow-log ^5.0 | ^6.0 | ^7.0 | ^8.0
以下模拟实现也可用:
- colinodell/psr-testlogger ^1.0
- metasyntactical/inmemory-logger ^1.0
- psr-mock/log-implementation ^1.0
如果您希望看到特定实现,请提交一个添加支持的拉取请求。
安装
composer require psr-discovery/log-implementations
用法
use PsrDiscovery\Discover; // Return an instance of the first discovered PSR-3 Log implementation. $log = Discover::log(); $log->info('Hello World!');
您还可以使用 Discover::logs()
来检索包含所有发现实现的数组。如果需要支持无法配置而无法实例化的实现,这很有用。
use PsrDiscovery\Discover; $logs = Discover::logs(); foreach ($logs as $log) { echo sprintf('Discovered %s v%s', $log->getPackage(), $log->getVersion()); }
处理失败
如果库无法发现合适的PSR-6实现,则 Discover::log()
发现方法将简单地返回 null
。这允许您优雅地处理失败,例如通过回退到默认实现。
示例
use PsrDiscovery\Discover; $log = Discover::log(); if ($log === null) { // No suitable Log implementation was discovered. // Fall back to a default implementation. $log = new DefaultLog(); }
单例
默认情况下,Discover::log()
方法将始终返回所发现实现的新的实例。如果您希望使用单例实例,只需将 true
传递给发现方法的 $singleton
参数即可。
示例
use PsrDiscovery\Discover; // $log1 !== $log2 (default) $log1 = Discover::log(); $log2 = Discover::log(); // $log1 === $log2 $log1 = Discover::log(singleton: true); $log2 = Discover::log(singleton: true);
模拟优先级
此库将优先搜索已知、可用的模拟库,然后再搜索实际实现。这是为了便于测试使用此库的代码。
预期这些模拟库将始终作为开发依赖项安装,因此如果它们可用,则打算使用它们。
偏好的实现
如果您想优先选择某个特定实现而非其他,您可以通过包名使用 prefer()
来选择。
use PsrDiscovery\Discover; use PsrDiscovery\Implementations\Psr3\Logs; // Prefer the a specific implementation of PSR-3 over others. Logs::prefer('league/container'); // Return an instance of League\Container\Container, // or the next available from the list of candidates, // Returns null if none are discovered. $log = Discover::log();
这将导致当可用时,log()
方法返回优先选择的实现,否则将回退到默认行为。
请注意,指定优先实现将使其优先于模拟库的默认偏好。
使用特定实现
如果您想强制使用特定实现并忽略其他发现候选者,您可以通过包名使用 use()
。
use PsrDiscovery\Discover; use PsrDiscovery\Implementations\Psr3\Logs; // Only discover a specific implementation of PSR-3. Logs::use('league/container'); // Return an instance of League\Container\Container, // or null if it is not available. $log = Discover::log();
这将导致当可用时,log()
方法返回优先选择的实现,否则将返回 null
。
本库非PHP-FIG生产、支持或以其他方式关联。