从Symfony中的存储库内部记录

时间:2018-09-03 14:32:35

标签: php symfony

我正在Symfony 2应用程序中追踪一个奇怪的错误,我想知道是否有一种方法可以从Repository PHP文件中打印日志消息。例如:

class OrderEntityRepository extends EntityRepository
{
    /**
    * 
    * @param mixed $filter
    * @return type
    */ 
    public function findByCriteria($filter) {
        [...]

        /* I'D LIKE TO LOG SOME VARIABLES FROM HERE */
    }
}

我尝试使用error_log(),但没有任何反应。

这可能吗?预先感谢,

3 个答案:

答案 0 :(得分:2)

有可能,但这通常不是一个好习惯。最好的做法是将存储库结果发送回您的Controller或Service,然后从其中记录错误或其他信息。

但是,如果您仍然想这样做,则存储库就像服务(当您实现ServiceEntityRepository see this slide for more information时)。如果要记录内部特定内容,则必须将LoggerInterface注入到存储库配置中(就像处理服务一样)。

在您的service.yml(或xml)中,如果您不使用自动装配:

Your\Repository:
    arguments: ['@logger']

在您的存储库类中:

/**
 * @var LoggerInterface
 */
protected $logger;


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

答案 1 :(得分:0)

关于symfony 3.8,我有

class BlahRepository extends ServiceEntityRepository
{

    /* @var ContainerInterface $container */
    private $container;

    /* @var LoggerInterface $logger */
    private $logger;

    public function __construct(RegistryInterface $registry, ContainerInterface $container, LoggerInterface $logger)
    {
        parent::__construct($registry, Blah::class);
        $this->container = $container;
        $this->logger = $logger;
    }
}

我可以使用$this->logger->info("text")

我认为窍门可能正在扩展ServiceEntityRepository

答案 2 :(得分:0)

为了对Doctrine实体存储库使用依赖项注入,可以创建自定义RepositoryFactory。
在Symfony 3.4上进行了测试。

ffmpeg -hwaccel cuvid -i input.mp4 -c:v h264_nvenc -pix_fmt yuv420p -preset slow output.mp4

以Doctrine配置对其进行声明。

<?php
namespace AppBundle\Doctrine;

use Doctrine\Common\Persistence\ObjectRepository;
use Doctrine\ORM\Configuration;
use Doctrine\ORM\EntityManagerInterface;
use Doctrine\ORM\Repository\DefaultRepositoryFactory;
use Doctrine\ORM\Repository\RepositoryFactory as RepositoryFactoryInterface;
use Psr\Log\LoggerAwareInterface;
use Psr\Log\LoggerInterface;

class RepositoryFactory implements RepositoryFactoryInterface, LoggerAwareInterface
{
    /** @var DefaultRepositoryFactory */
    protected $defaultRepositoryFactory;

    /** @var LoggerInterface */
    private $logger;

    /**
     * @required (for autowiring)
     * @param LoggerInterface $logger (Monolog will be the default one)
     */
    public function setLogger(LoggerInterface $logger): void
    {
        $this->logger = $logger;
    }

    /**
     * @see Configuration::getRepositoryFactory()
     */
    public function __construct()
    {
        $this->defaultRepositoryFactory = new DefaultRepositoryFactory();
    }

    /**
     * Gets the repository for an entity class.
     *
     * @param EntityManagerInterface $entityManager
     * @param string $entityName The name of the entity.
     * @return ObjectRepository
     */
    public function getRepository(EntityManagerInterface $entityManager, $entityName): ObjectRepository
    {
        $repository = $this->defaultRepositoryFactory->getRepository($entityManager, $entityName);

        if ($repository instanceof LoggerAwareInterface && $this->logger !== null) {
            $repository->setLogger($this->logger);
        }

        return $repository;
    }
}

最后,使您的存储库类实现# app/config.yml doctrine: # ... orm: repository_factory: AppBundle\Doctrine\RepositoryFactory

LoggerAwareInterface

您还可以设置class OrderEntityRepository extends EntityRepository implements LoggerAwareInterface { /** @var LoggerInterface */ private $logger; /** * @param LoggerInterface $logger */ public function setLogger(LoggerInterface $logger): void { $this->logger = $logger; } /** * @param mixed $filter * @return type */ public function findByCriteria($filter) { //[...] $this->logger->alert('message'); } } 特性,以节省一些代码重复。