2

我目前正在开发一个 Symfony 2 应用程序,我想在我的模型中调用一些 setter 时记录下来。

如我所见,默认情况下无法注入记录器或通过 Symfony 2 中的静态注册表访问它,所以我的方法如下:

我在模型的基类中添加了一个静态方法和属性,并在那里设置了 Logger。我还添加了一个吸气剂,然后在我的模型中可用。

我通过请求内核事件在其中设置了记录器,因此记录器仅在此事件之后可用。

这个解决方案有效,但对我来说似乎相当 hacky。有人对如何解决这个问题有更好的想法吗?不依赖请求内核事件的设置方法会很好。不依赖静态属性的方法会更好!

注意力!将记录器添加到基本文档可能会导致序列化问题。

4

2 回答 2

0

I just put it as a second argument to the setter:

Supposing that you have an Entity so a solution ti the following:

//Namespace Declaration above
class SomeEntity 
{
 ....
 private $somefield;

 public function setSomefield($somefield,LoggerService $l)
 {
    $this->somefield=$someField;
    $l->log(""Somefield Has Been Set"");  
 }
}

Note: Instead of LoggerService replace it with the logger class you may have developed and call the appropriate methods the LoggerService is an assumptio I make in order to show the way.

In case you are using Monolog and not some custom LoggingClass:

//Namespace Declaration above
use Symfony\Bridge\Monolog\Logger;

class SomeEntity 
{
 ....
 private $somefield;

 public function setSomefield($somefield,Logger $l)
 {
    $this->somefield=$someField;
    $l->info("Somefield Has Been Set");  
 }
}

I hope it fits your needs. This will help you better to Log the setters without probs with serialization.

于 2017-04-10T10:11:35.093 回答
-1

您可以使用 Monolog(官方文档)来记录活动。将记录器注册为服务,该服务将在服务容器中可用。

在 app/config.yml 中的 services 下,注册 logger 服务及其处理程序。注册处理程序时,根据参数指定日志文件。在下面给出的示例中,文件名将是 dev.api.log 或 prod.api.log,具体取决于环境。

bt.api.logger:
  class: Symfony\Bridge\Monolog\Logger
  arguments: [app]
  calls:
    - [pushHandler, [@bt.api.logger_handler]]

bt.api.logger_handler:
  class: Monolog\Handler\StreamHandler       
  arguments: [%kernel.logs_dir%/%kernel.environment%.api.log, 200]

注册记录器服务后,可以在控制器中调用它,如下所示

$logger = $this->get('bt.api.logger');
$msg = "The setter was called";
$logger->info(msg);
于 2014-04-07T11:37:22.497 回答