我正在使用事件管理器来引发需要记录的事件(这是Phalcon的事件管理器,但对于这个问题并不重要)。 Phalcon的事件管理器允许您为另一个对象引发的事件注册一个监听器。每当事件a
发生时,Phalcon的事件管理员都会调用Listener::a()
。
我使用事件的原因是我不希望我的业务逻辑混乱使用日志语句。
因此,对于我的示例场景,让我们假设您有一个UserService
对象,其中包含signUp()
,signIn()
,grantPermission()
,revokePermission()
等方法,等等。这些中的每一个都会引发一个具有自己数据的事件,这意味着我需要不同的数据来构造日志消息,因此传递的是不同的东西。例如,我的signUpSuccessful日志消息是“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()
这些字符串,这似乎不是一个优雅的解决方案我