如何以DRY方式构建日志消息?

时间:2014-07-23 15:18:45

标签: php oop events

我正在使用事件管理器来引发需要记录的事件(这是Phalcon的事件管理器,但对于这个问题并不重要)。 Phalcon的事件管理器允许您为另一个对象引发的事件注册一个监听器。每当事件a发生时,Phalcon的事件管理员都会调用Listener::a()

我使用事件的原因是我不希望我的业务逻辑混乱使用日志语句。

因此,对于我的示例场景,让我们假设您有一个UserService对象,其中包含signUp()signIn()grantPermission()revokePermission()等方法,等等。这些中的每一个都会引发一个具有自己数据的事件,这意味着我需要不同的数据来构造日志消息,因此传递的是不同的东西。例如,我的s​​ignUpSuccessful日志消息是“User#4 created。”。要创建此消息,我需要用户的ID,因此我的UserService会执行:

$eventManager->fire('signUpSuccessful', $this, $user);

我的听众会:

public function signUpSuccessful($event, $source, $data)
{
    $this->logger->log(Logger::info, 'User #' . $data->getId() . ' created.');
}

现在,正如您可以想象的那样,如果我继续这个趋势,这个类将包含许多除了使用$data属性构建日志消息之外什么都不做的函数。

如何在不创建大量功能的情况下构建消息?这有设计模式吗?我曾想过覆盖__call(),但这意味着我应该将日志消息创建逻辑嵌入静态数组中的字符串中,然后eval()这些字符串,这似乎不是一个优雅的解决方案我

0 个答案:

没有答案