我正在处理EntityRepository类,我需要将一些数据转储到我的日志文件中。我不能使用dump(),因为这不会构建一个页面;它只是要返回一些JSON。最终
通常,在控制器中,我使用:
$logger = $this->getLogger();
但我不在控制器中。
感谢您的帮助。
更新:这是用于取证记录。我只是将它用于调试目的。之后它会被删除。
答案 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实体监听器,可能是在后加载时。在侦听器中注入记录器。 一旦您决定不需要它,只需删除监听器。