psr-discovery/log-implementations

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

1.0.1 2024-03-04 21:32 UTC

This package is auto-updated.

Last update: 2024-09-04 22:25:59 UTC


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 实现:

以下实现可以被发现,但需要手动实例化,因为它们的配置要求:

以下模拟实现也可用:

如果您希望看到特定实现,请提交一个添加支持的拉取请求。

安装

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生产、支持或以其他方式关联。