我使用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采取了错误的对象。
任何提示都会有所帮助;)
修改:已解决,请查看以下帖子。
答案 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;