Доктрина DBAL регистратор sql в тестовой среде

#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
 

не требуются.