假设您有一个符合 PSR 记录器接口标准的类,但您希望它也可供不需要记录或不打扰 PSR 记录器的人使用。我很清楚对记录器使用方法注入(类似function setLogger(Psr\Log\LoggerInterface $logger){...}
)。现在我想知道如果我不能确定是否指定了记录器类,如何调用记录器的方法。解决方案之一是创建一个充当记录器代理的类,但我不确定这是合适的解决方案。
问问题
69 次
2 回答
3
您可以实现“NullLogger”并将其作为默认记录器:
class NullLogger implement LoggerInterface
{
public function error($message, $context = [])
{
// do nothing
}
// ...
}
class MyClass
{
private $logger;
public function __construct(LoggerInterface $logger = null)
{
$this->logger = $logger ?: new NullLogger();
}
public function doSomething()
{
$this->logger->info('');
// ...
}
public function setLogger(LoggerInterface $logger)
{
$this->logger = $logger;
}
}
我也会认真考虑旧的:
if ($this->logger) {
$this->logger->...
}
(如果它没有在任何地方使用)因为它更轻量级。
但第一个解决方案绝对是有效的 IMO。
最后,您还可以决定日志记录与您的类没有直接关系,而这种行为可以留给用户负责。您可以使用事件或模板方法模式提供扩展点(如果您有兴趣,请参阅我的问题:我应该为开源库使用事件还是“模板方法”模式?)。
总而言之,我想说这取决于用例:你记录很多吗?“记录”是您提供的功能的一部分吗?或者这显然是一个单独的问题?
于 2013-09-19T21:17:57.643 回答
1
事实证明,PSR 标准定义了一个空记录器,可用于此目的。
<?php
use \PSR\Log\NullLogger
于 2013-12-05T14:59:16.717 回答