arnapou / message-templates
库 - messagetemplates.org的PHP实现
v1.0.1
2024-09-12 21:29 UTC
Requires
- php: ~8.2.0 || ~8.3.0
- psr/log: ^2.0 || ^3.0
Requires (Dev)
- ext-intl: *
- friendsofphp/php-cs-fixer: ^3.52
- phpstan/extension-installer: ^1.3
- phpstan/phpstan: ^1.10
- phpstan/phpstan-deprecation-rules: ^1.1
- phpstan/phpstan-phpunit: ^1.3
- phpstan/phpstan-strict-rules: ^1.5
- phpunit/php-code-coverage: ^11.0
- phpunit/phpunit: ^11.0
README
messagetemplates.org的PHP实现 (GitHub)。
安装
composer require arnapou/message-templates
packagist 👉️ arnapou/message-templates
摘要
一个语言无关的规范,用于1)捕获和2)以人类友好且机器可读的格式渲染结构化日志事件。
使用此PHP实现的示例
消息模板记录器
这是一个按照规范描述的记录器,它执行以下操作:
- 捕获
- 渲染
由于PSR-3的签名不同,我们使用受PSR-3 LoggerInterface
启发的 MessageTemplateLoggerInterface
use Arnapou\MessageTemplates\MessageTemplateLogger;
$logger = new MessageTemplateLogger($psrLogger);
$logger->emergency('User {username} logged in from {ip_address}', 'Alice', '123.45.67.89');
$logger->alert('User {username} logged in from {ip_address}', 'Alice', '123.45.67.89');
$logger->critical('User {username} logged in from {ip_address}', 'Alice', '123.45.67.89');
$logger->error('User {username} logged in from {ip_address}', 'Alice', '123.45.67.89');
$logger->warning('User {username} logged in from {ip_address}', 'Alice', '123.45.67.89');
$logger->notice('User {username} logged in from {ip_address}', 'Alice', '123.45.67.89');
$logger->info('User {username} logged in from {ip_address}', 'Alice', '123.45.67.89');
$logger->debug('User {username} logged in from {ip_address}', 'Alice', '123.45.67.89');
$logger->log($level, 'User {username} logged in from {ip_address}', 'Alice', '123.45.67.89');
消息模板PSR-3记录器
这是一个具有消息模板功能的纯PSR-3 LoggerInterface
装饰器。
它只执行规范中的“渲染”部分,使用PSR-3上下文作为捕获的一组属性进行渲染。
你可以在上下文中发送比模板所需更多的元素,但不能发送更少的元素。
这类似于消息验证阶段(即使你不打算渲染模板)。
这个记录器有一个注入的 HoleRenderingInterface
允许你在PSR-3装饰的记录器实现以另一种方式渲染对象之前,自定义对象 到 消息的渲染。
use Arnapou\MessageTemplates\MessageTemplatePsrLogger;
$logger = new MessageTemplatePsrLogger($psrLogger);
$logger->emergency('User {username} logged in from {ip_address}', ['username'=> 'Alice', 'ip_address' => '123.45.67.89']);
$logger->alert('User {username} logged in from {ip_address}', ['username'=> 'Alice', 'ip_address' => '123.45.67.89']);
$logger->critical('User {username} logged in from {ip_address}', ['username'=> 'Alice', 'ip_address' => '123.45.67.89']);
$logger->error('User {username} logged in from {ip_address}', ['username'=> 'Alice', 'ip_address' => '123.45.67.89']);
$logger->warning('User {username} logged in from {ip_address}', ['username'=> 'Alice', 'ip_address' => '123.45.67.89']);
$logger->notice('User {username} logged in from {ip_address}', ['username'=> 'Alice', 'ip_address' => '123.45.67.89']);
$logger->info('User {username} logged in from {ip_address}', ['username'=> 'Alice', 'ip_address' => '123.45.67.89']);
$logger->debug('User {username} logged in from {ip_address}', ['username'=> 'Alice', 'ip_address' => '123.45.67.89']);
$logger->log($level, 'User {username} logged in from {ip_address}', ['username'=> 'Alice', 'ip_address' => '123.45.67.89']);
直接使用
所有内容都在lib中正确解耦。
因此,你可以按自己的意愿操纵模板消息。
use Arnapou\MessageTemplates\MessageTemplate;
use Arnapou\MessageTemplates\Hole\DefaultImplementation;
$template = new MessageTemplate('User {username} logged in from {$ip_address:[%s]}');
$template->simplifiedTemplate();
// "User {username} logged in from {ip_address}"
foreach($template->combine('Alice', '123.45.67.89') as [$segment, $value]) {
// ["User ", null]
// [<Hole Object, name: username>, 'Alice']
// [" logged in from ", null]
// [<Hole Object, name: ip_address>, '123.45.67.89']
}
$holeCapturing = new DefaultImplementation();
$template->capture($holeCapturing, 'Alice', '123.45.67.89');
// ['username' => 'Alice', 'ip_address' => '123.45.67.89']
$holeRendering = new DefaultImplementation();
$template->render($holeCapturing, ['username' => 'Alice', 'ip_address' => '123.45.67.89']);
// "User Alice logged in from [123.45.67.89]"
$template->captureAndRender($holeCapturing, $holeRendering, 'Alice', '123.45.67.89');
// "User Alice logged in from [123.45.67.89]"
自定义捕获和渲染
创建你自己的实现
你可以
- 将它们注入到MessageTemplateLogger
- 将捕获实现直接用于MessageTemplate::capture()
- 将渲染实现直接用于MessageTemplate::render()
- 将两种实现直接用于MessageTemplate::captureAndRender()
此库有一个DefaultImplementation,这应该满足你大多数常见需求。
PHP版本
日期 | 参考 | 8.3 | 8.2 |
---|---|---|---|
10/09/2024 | 1.x,主要 | × | × |