我正在处理一个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');
}
}
完全披露:这是未经测试的代码 - 可能存在错误!
根据您要记录的内容,最简洁的解决方案是创建一个学说或学说实体侦听器,可能在后加载时。在侦听器中注入记录器。一旦你决定你不需要它,只需删除侦听器。