在 Symfony 中获取记录器,而不是在控制器中获取记录器



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

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

$logger = $this->getLogger();

但我不在控制器中。

感谢您的帮助。

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

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

但是,如何将记录器注入到该学说正在创建的存储库中呢?事实证明,您可以指定自己的存储库工厂

我将假设它所需要的只是实现DoctrineORMRepositoryRepositoryFactory接口,但您可能希望子类化DoctrineORMRepositoryDefaultRepositoryFactory

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

src/AppBundle/Doctrine/EntityRepository.php

<?php
namespace AppBundleDoctrine;
use DoctrineORMEntityRepository;
use PsrLogLoggerInterface;
class LoggerAwareEntityRepository extends EntityRepository
{
    protected $logger;
    public function setLogger(LoggerInterface $logger)
    {
        $this->logger = $logger;
    }
}

现在,工厂

src/AppBundle/Doctrine/LoggerAwareRepositoryFactory.php

<?php
namespace AppBundleDoctrine;
use DoctrineORMRepositoryDefaultRepositoryFactory;
use DoctrineORMEntityManagerInterface;
use PsrLogLoggerInterface;
use AppBundleDoctrineLoggerAwareEntityRepository;
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;
    }
}

现在让配置胶水让它一切工作

app/config/services.yml

services:
    logger_aware_repository_factory:
        class: AppBundleDoctrineLoggerAwareRepositoryFactory
        arguments: ['@logger']
app/config

/config.yml

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

最后,对于实际实施

src/AppBundle/Entity/SomeCustomRepository.php

<?php
namespace AppBundleEntity;
use AppBundleDoctrineLoggerAwareEntityRepository;
class SomeCustomRepository extends LoggerAwareEntityRepository
{
    public function findSomethingCustom()
    {
        // Log something
        $this->logger->log('message');
    }
}

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

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

最新更新