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

时间:2013-11-14 16:19:45

标签: php symfony sonata-admin symfony-sonata monolog

我使用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采取了错误的对象。

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

修改:已解决,请查看以下帖子。

2 个答案:

答案 0 :(得分:2)

您需要添加

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

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

use Symfony\Bridge\Monolog\Logger

....

public function setLogger(Logger $logger) {
    $this->logger = $logger;
}

之后你可以照常登录

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

<强>更新

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

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

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

答案 1 :(得分:0)

也许你必须这样得到记录器对象:

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

并在开头添加,如果这不起作用:

use Symfony\Component\HttpKernel\Log\LoggerInterface;