Symfony 4 + драйвер кеширования Doctrine DBAL

Я начал очень простой проект, используя только symfony / skeleton и doctrine / doctrine-bundle.

Я НЕ использую ORM, просто DBAL. Не установил symfony / orm-pack.

Я пытаюсь кэшировать результат простого запроса и получаю исключение с сообщением «Попытка кэшировать запрос, но драйвер результата не настроен».

Пример кода:

$query = $connection->createQueryBuilder()
    ->select('*')
    ->from('common.Language')
    ->getSQL();
$qcp = new QueryCacheProfile(0, "languages");
$stmt = $connection->executeCacheQuery($query, [], [], $qcp);
$rows = $stmt->fetchAll();
$stmt->closeCursor();

Я читал, что могу включить кеш, реализовав небольшой пакет для изменения конфигурации соединения DBAL на этапе компиляции контейнера здесь. Но я не могу заставить его работать. Я предполагаю, потому что он пытается назначить DBAL тот же драйвер кеша, который использует ORM, но у меня нет установленного ORM.

Как мне это сделать? Я создал простой класс, который вводит соединение DBAL и настраивает кеш во время выполнения, а затем все мои репозитории / daos вводят этот класс. Но я не считаю, что это правильный способ добиться этого ...

public function __construct(Connection $connection, ContainerInterface $container)
{
    /** @var Kernel $kernel */
    $kernel = $container->get('kernel');

    $cacheProviders = [];

    if ($kernel->isDebug()) {
        $cacheProviders[] = new ArrayCache();
    } else {
        $cacheProviders[] = new PhpFileCache($kernel->getCacheDir().'/dbal');
    }

    $connection->getConfiguration()->setResultCacheImpl(new ChainCache($cacheProviders));
}

PD: Использование symfony 4.1 с DBAL 2.7.1

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Symfony Station Communiqué - 17 февраля 2023 г
Symfony Station Communiqué - 17 февраля 2023 г
Это коммюнике первоначально появилось на Symfony Station , вашем источнике передовых новостей Symfony, PHP и кибербезопасности.
Управление ответами api для исключений на Symfony с помощью KernelEvents
Управление ответами api для исключений на Symfony с помощью KernelEvents
Много раз при создании api нам нужно возвращать клиентам разные ответы в зависимости от возникшего исключения.
1
0
1 062
1

Ответы 1

согласно вашему посту https://github.com/doctrine/DoctrineBundle/issues/833

и ссылаясь на то, что все еще открыт https://github.com/doctrine/DoctrineBundle/issues/114, поэтому эта функция не решена!

для временного решения проблемы, я советую вам заменить executeCacheQuery на тест executeQuery +:

    $qcp = new QueryCacheProfile('3600', "someKey");
    $qcp = empty($qcp->getResultCacheDriver()) ? null : $qcp;//test for existing 


    $conn = $this->getEntityManager()->getConnection();
    $stmt = $conn->executeQuery(
        $query,
        [],
        [],
        $qcp

прочитав Документы, заметил, что в конфиге не установлен ОБНОВЛЕНО:

    $conn = $this->getEntityManager()->getConnection();
    $cache = new \Doctrine\Common\Cache\ArrayCache();
    $config = $conn->getConfiguration();
    $config->setResultCacheImpl($cache);

    $qcp = new QueryCacheProfile('3600', "someKey", $cache);
    $qcp = empty($qcp->getResultCacheDriver()) ? null : $qcp;//cache driver exist?

    $stmt = $conn->executeQuery(
        $query,
        [],
        [],
        $qcp
    );

Другие вопросы по теме