Наличие этого объекта:
/**
* @ORM\Entity
* @ORM\Table(name="nomencladores.pais", schema="nomencladores")
* @ORM\Entity(repositoryClass="AppBundle\Entity\Repository\PaisRepository")
* @UniqueEntity(fields={"nombre"}, message="El pais ya existe en nuestra base de datos")
*/
class Pais
{
use IdentifierAutogeneratedEntityTrait;
use NamedEntityTrait;
use ActiveEntityTrait;
}
И этот репозиторий:
class PaisRepository extends EntityRepository
{
public function getPaises()
{
$qb = $this->createQueryBuilder('pais');
$query = $qb->getQuery();
$query->useResultCache(true, 3600, 'paises_cache');
return $query->getResult();
}
}
И выполняя этот вызов на моем контроллере:
/**
* @Route("/paises", name="paises")
* @Method("GET")
*/
public function getPaisAction()
{
$em = $this->getDoctrine()->getManager();
$entities = $em->getRepository('AppBundle:Pais')->getPaises();
$response['message'] = "";
$response['entities'] = [];
if (!$entities) {
$response['message'] = "No se encontraron países";
}
foreach ($entities as $pais) {
$paises = array();
$paises['id'] = $pais->getId();
$paises['text'] = $pais->getNombre();
$response['entities'][] = $paises;
}
return new JsonResponse($response);
}
И имея это в файле config_prod.yml
:
doctrine:
orm:
metadata_cache_driver: apc
result_cache_driver: apc
query_cache_driver: apc
Как узнать, использует ли мое приложение результаты кеша или все время выполняет запрос БД? Я вижу панель инструментов Symfony2 (потому что я выполняю тест в среде dev), и все время я вижу запрос таблицы paises
что заставляет меня думать, что кеш не используется.
Я считаю, что вам нужно рассказать Doctrine, когда использовать сконфигурированный драйвер кэширования, например:
public function getSomeEntities()
{
$qb = $this->createQueryBuilder('a');
$qb
->where('a.title = "test article"')
->orderBy('id', 'ASC')
;
$query = $qb->getQuery();
$query->useResultCache(true, 60, 'uniqueCacheId');
return $query->getResult();
}
Вы также можете указать использование кеширования запросов:
$query->useQueryCache(true);
В документации Doctrine\ORM\Query вы можете увидеть, что функция useQueryCache
принимает один логический параметр, а useResultCache
имеет следующие параметры:
useResultCache( boolean $bool, integer $timeToLive = null, string $resultCacheId = null )