Я начал очень простой проект, используя только 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




согласно вашему посту 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
);