使用 postUpdate($object) / Sonata & Symfony 2 创建对象时写入日志


Write a log when an object is created with postUpdate($object) / Sonata & Symfony 2

我使用Symfony和Sonata创建了一个管理界面。目前,一切正常。

现在,我想根据本教程测试钩子是如何工作的: http://sonata-project.org/bundles/admin/master/doc/reference/saving_hooks.html目前,我只想测试这种方法是如何工作的。我想做的是编写日志,我通过管理界面创建对象的所有内容。这是我的 AdminClass 代码的第一部分(工作):

namespace AAA'AdminBundle'Admin;
use Sonata'AdminBundle'Admin'Admin;
use Sonata'AdminBundle'Datagrid'ListMapper;
use Sonata'AdminBundle'Datagrid'DatagridMapper;
use Sonata'AdminBundle'Form'FormMapper;
use Sonata'AdminBundle'Validator'ErrorElement;
class CompteAdmin extends Admin
{
// Fields to be shown on create/edit forms
protected function configureFormFields(FormMapper $formMapper)
{
    $formMapper
        ->add('prenom')
        ->add('nom')
        ->add('fonction')
    ;
}

这是以下部分(不起作用):

public function postPersist($logger)
{
    $logger = $this->get('logger');
    $logger->err('Une erreur est survenue');
}

尝试添加对象时,我有此日志错误:

PHP Fatal error:  Call to undefined method INERIS'AdminBundle'Admin'CompteAdmin::get()

PHP Fatal error:  Call to undefined method INERIS'AdminBundle'Entity'Compte::err()

取决于我是否评论行。

要写入日志,Symfony使用Monolog。我 http://symfony.com/doc/current/cookbook/logging/monolog.html 遵循了本教程,但显然我错了,因为$logger应该声明到控制器中,而不是在那里。

那我不知道怎么弄清楚。

也许在 AdminClass 的开头缺少一个添加以启用 Monolog。也许我的函数 postPersist 采用了错误的对象。

任何提示都会有所帮助;)

编辑:已解决,请查看下面的帖子。

你需要添加

 calls:
   - [ setLogger, ['%logger%'] ]

到 admin 的服务定义(通常在 admin.yml 中)并将方法添加到 *Admin 类

use Symfony'Bridge'Monolog'Logger
....
public function setLogger(Logger $logger) {
    $this->logger = $logger;
}

之后,您可以像往常一样登录

$this->logger->err('Une erreur est survenue');

更新

评论中讨论后,这是在*Admin类中获取记录器的正确方法:

public function postPersist($logger)
{
    $logger = $this->getConfigurationPool()->getContainer()->get('logger');
    $logger->err('Une erreur est survenue');
}    

看起来SonataAdminBundle不使用标准的服务注入/解析系统

也许你必须这样获取记录器对象:

$logger = $this->getContainer()->get('logger');

并在开头添加以下内容,如果这不起作用:

use Symfony'Component'HttpKernel'Log'LoggerInterface;