Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何以干式方式构造日志消息?_Php_Oop_Events - Fatal编程技术网

Php 如何以干式方式构造日志消息?

Php 如何以干式方式构造日志消息?,php,oop,events,Php,Oop,Events,我正在使用事件管理器来引发需要记录的事件。这是Phalcon的事件管理器,但对于这个问题来说并不重要。Phalcon的事件管理器允许您注册另一个对象引发的事件的侦听器。每当事件a发生时,Phalcon的事件管理器调用Listener::a 我使用事件的原因是我不希望我的业务逻辑被日志语句弄得乱七八糟 因此,在我的示例场景中,让我们假设您有一个UserService对象,它具有诸如signUp、signIn、grantPermission、revokePermission等方法。每一个都会引发一个

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

我使用事件的原因是我不希望我的业务逻辑被日志语句弄得乱七八糟

因此,在我的示例场景中,让我们假设您有一个UserService对象,它具有诸如signUp、signIn、grantPermission、revokePermission等方法。每一个都会引发一个事件,它有自己的数据,这意味着我需要不同的数据来构造日志消息,因此传递的是不同的内容。例如,我的signUpSuccessful日志消息是用户4创建的。。要创建此消息,我需要用户id,因此我的UserService将执行以下操作:

我的听众会有:

public function signUpSuccessful($event, $source, $data)
{
    $this->logger->log(Logger::info, 'User #' . $data->getId() . ' created.');
}
现在,您可以想象,如果我继续这个趋势,这个类将包含很多函数,它们除了使用$data属性来构造日志消息之外什么都不做


如何在不创建大量函数的情况下构造消息?这个有设计模式吗?我曾想过重写_调用,但这意味着我应该将日志消息创建逻辑嵌入到静态数组中的字符串中,然后对这些字符串求值,这对我来说似乎不是一个优雅的解决方案。

你不能存储数组,然后使用类似sprintf的东西来输入值,而不是求值吗?这稍微干净了一点。我仍然需要创建许多使用sprintf创建日志消息的函数,只需使用%s而不是concatenationYou可以用日志字符串替换第三个参数:public function signUpSuccessful$event,$source,'log message here'。然后:$this->logger->logLogger::info,$third_param;是的,但是使用事件有什么意义呢?我可以创建一个UserServiceLogger类,它只接受一个字符串参数并记录它。然而,我尽量不让sprintf和日志消息构造逻辑扰乱我的业务逻辑。
public function signUpSuccessful($event, $source, $data)
{
    $this->logger->log(Logger::info, 'User #' . $data->getId() . ' created.');
}