我目前正在开发一个Symfony 2应用程序,我想在我的模型中调用一些setter时记录。
正如我所见,默认情况下无法注入记录器或通过Symfony 2中的静态注册表访问它,所以我的方法如下:
我在模型的基类中添加了静态方法和属性,并在那里设置了Logger。 我还添加了一个吸气剂,然后可以在我的模型中使用。
我通过请求内核事件在那里设置记录器,因此记录器仅在此事件之后可用。
这个解决方案有效,但对我来说似乎相当讨厌。谁有更好的想法如何处理这个?不依赖于请求内核事件的设置方法会很好。一个不依赖静态属性的方法会更好!
注意!将记录器添加到基础文档可能会导致序列化问题。
答案 0 :(得分:0)
我只是把它作为第二个参数给了setter:
假设您有一个实体,所以解决方案如下:
//Namespace Declaration above
class SomeEntity
{
....
private $somefield;
public function setSomefield($somefield,LoggerService $l)
{
$this->somefield=$someField;
$l->log(""Somefield Has Been Set"");
}
}
注意:而不是LoggerService
用你可能已经开发的记录器类替换它并调用适当的方法LoggerService
是我做出的假设,以便显示方式。
如果您使用的是Monolog而不是某些自定义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");
}
}
我希望它符合您的需求。这将有助于您更好地在没有序列化的probs的情况下记录setter。
答案 1 :(得分:-1)
您可以使用Monolog(official documentation)记录活动。将记录器作为服务注册,该服务将在服务容器中可用。
在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);