在控制器中获取Symfony WheNot中的记录器

时间:2015-06-19 17:15:39

标签: symfony logging

我正在处理EntityRepository类,我需要将一些数据转储到我的日志文件中。我不能使用dump(),因为这不会构建一个页面;它只是要返回一些JSON。最终

通常,在控制器中,我使用:

$logger = $this->getLogger();

但我不在控制器中。

感谢您的帮助。

更新:这是用于取证记录。我只是将它用于调试目的。之后它会被删除。

2 个答案:

答案 0 :(得分:3)

我对此进行了一些研究。我的第一个预感是"好吧,如果你可以将EntityRepositories定义为服务,那么这将使这变得容易,因为你可以只注入记录器"

但是如何将记录器注入教条正在创建的存储库中?事实证明你可以specify your own repository factory

我将假设所有需要的是实现Doctrine\ORM\Repository\RepositoryFactory接口,但您可能希望继承Doctrine\ORM\Repository\DefaultRepositoryFactory

您还需要创建自己的基本存储库类,它可以容纳记录器。让我们从那里开始

<强>的src /的appbundle /学说/ EntityRepository.php

<?php

namespace AppBundle\Doctrine;

use Doctrine\ORM\EntityRepository;
use Psr\Log\LoggerInterface;

class LoggerAwareEntityRepository extends EntityRepository
{
    protected $logger;

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

现在,工厂

<强>的src /的appbundle /学说/ LoggerAwareRepositoryFactory.php

<?php

namespace AppBundle\Doctrine;

use Doctrine\ORM\Repository\DefaultRepositoryFactory;
use Doctrine\ORM\EntityManagerInterface;
use Psr\Log\LoggerInterface;
use AppBundle\Doctrine\LoggerAwareEntityRepository;

class LoggerAwareRepositoryFactory extends DefaultRepositoryFactory
{
    protected $logger;

    public function __construct(LoggerInterface $logger)
    {
        $this->logger = $logger;
    }

    protected function createRepository(EntityManagerInterface $entityManager, $entityName)
    {
        $repository = parent::createRepository($entityManager, $entityName);

        if ($repository instanceof LoggerAwareEntityRepository) {
            $repository->setLogger($this->logger);
        }

        return $repository;
    }
}

现在为配置胶水使其全部工作

应用/配置/ services.yml

services:
    logger_aware_repository_factory:
        class: AppBundle\Doctrine\LoggerAwareRepositoryFactory
        arguments: ['@logger']

应用/配置/ config.yml

doctrine:
    orm:
        entity_managers:
            default:
                repository_factory: "@logger_aware_repository_factory"

最后,对于实际实施

<强>的src /的appbundle /实体/ SomeCustomRepository.php

<?php

namespace AppBundle\Entity;

use AppBundle\Doctrine\LoggerAwareEntityRepository;

class SomeCustomRepository extends LoggerAwareEntityRepository
{
    public function findSomethingCustom()
    {
        // Log something
        $this->logger->log('message');
    }
}
  

完全披露:这是未经测试的代码 - 可能存在错误!

答案 1 :(得分:0)

根据您要记录的内容,最简洁的解决方案是创建一个doctrine或doctrine实体监听器,可能是在后加载时。在侦听器中注入记录器。 一旦您决定不需要它,只需删除监听器。