我使用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;