#doctrine
Вопрос:
Я хочу проверить время выполнения запроса DoctrineDBALLoggingSQLLogger
во время тестирования.
Конфигурация в конфигурации/пакетах/тест/доктрина.yaml:
doctrine:
dbal:
dbname_suffix: '_test%env(default::TEST_TOKEN)%'
logging: true
profiling: true
Код:
public function testSingleInsertTime()
{
$maxTimeInMs = 0.1; // Please ignore this and the fact that I'm testing single insert. Actual code is different.
$em = static::$entityManager;
$em->getConfiguration()->setSQLLogger(new DebugStack());
/** @var DebugStack */
$sqlLogger = $em->getConfiguration()->getSQLLogger();
$productState = (new ProductState())
->setId(123)
->setHash('EXP000276669cc123038419f265bf124')
;
$em->persist($productState);
$em->flush();
dump($sqlLogger->queries);die; // HERE i get an empty array :(
$actualTime = 1; // TODO: get from logger
$this->assertGreaterThan($maxTimeInMs, $actualTime);
}
После php bin/phpunit --filter testSingleInsertTime tests/Doctrine/ProductTest.php
того, как я получу пустой массив после вызова flush. Что случилось?
__
Обновить
Смотрите, даже простой контроллер с dev
окружающей средой выходит из строя! Что-то не так с моим кодом. Регистратор Sql может работать и по-другому.
use DoctrineDBALLoggingDebugStack;
class DataDMLController extends AbstractController
{
/**
* @Route("/action", name="action")
*/
public function action(EntityManagerInterface $em)
{
$em->getConfiguration()->setSQLLogger(new DebugStack());
/** @var DebugStack */
$sqlLogger = $em->getConfiguration()->getSQLLogger();
$productState = (new ProductState())
->setId(124)
->setHash('EXP000276669cc123038419f265bf124')
;
$em->persist($productState);
$em->flush();
dump($sqlLogger->queries); // an empty array!
die;
return new Response();
}
}
Комментарии:
1. Пожалуйста, вставьте код отладочного пакета. Ваша тестовая конфигурация выглядит нормально
2. Я просто использую класс DoctrineDBALLoggingDebugStack. Я обновил свой вопрос!
Ответ №1:
Решение заключается в том, чтобы получить конфигурацию из подключения (не напрямую из диспетчера сущностей).
$em->getConnection()->getConfiguration()->setSQLLogger(new DebugStack());
Мы должны понимать, что EntityManagerInterface имеет свою собственную конфигурацию, и соединение также имеет свою собственную, поэтому у нас есть 2 разные конфигурации, и мы должны установить регистратор sql для соединения, которое находится в компоненте DBAL, и такой компонент управляет выполнением запросов. Ну, это не роль менеджера предприятия, так что теперь это ясно и понятно.
__
Опции
logging: true
profiling: true
не требуются.