我正在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()
,但没有任何反应。
这可能吗?预先感谢,
答案 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');
}
}
特性,以节省一些代码重复。