Атрибут Cache
Атрибут Cache вешается на класс сущности
и включает кеш второго уровня Doctrine. Первым
параметром передаётся режим использования кеша
(usage), вторым - область кеша
(region). После включения кеша Doctrine
хранит загруженные сущности в регионе и повторно
не обращается к базе данных при их повторном
запросе.
Синтаксис
#[Cache(usage: usage, region: region)]
Пример
Давайте включим кеш второго уровня для сущности
Article в режиме чтения-записи:
<?php
namespace App\Entity;
use Doctrine\ORM\Mapping as ORM;
#[ORM\Entity]
#[ORM\Cache(usage: 'READ_WRITE', region: 'article_region')]
class Article
{
#[ORM\Id]
#[ORM\GeneratedValue]
#[ORM\Column]
private ?int $id = null;
#[ORM\Column(type: 'string')]
private string $title;
#[ORM\Column(type: 'text')]
private string $text;
public function getId(): ?int
{
return $this->id;
}
public function getTitle(): string
{
return $this->title;
}
public function setTitle(string $title): self
{
$this->title = $title;
return $this;
}
public function getText(): string
{
return $this->text;
}
public function setText(string $text): self
{
$this->text = $text;
return $this;
}
}
?>
После запроса сущности по идентификатору Doctrine
положит её в регион article_region. Повторный
запрос той же сущности вернёт данные из кеша.
Пример
Давайте включим кеш в режиме только чтения:
<?php
namespace App\Entity;
use Doctrine\ORM\Mapping as ORM;
#[ORM\Entity]
#[ORM\Cache(usage: 'READ_ONLY')]
class Article
{
#[ORM\Id]
#[ORM\GeneratedValue]
#[ORM\Column]
private ?int $id = null;
#[ORM\Column(type: 'string')]
private string $title;
public function getId(): ?int
{
return $this->id;
}
public function getTitle(): string
{
return $this->title;
}
}
?>
В режиме READ_ONLY сущность после первого
чтения кешируется и больше не обновляется из базы
данных. Такой режим подходит для справочников,
которые не меняются во время работы приложения.
Пример
Давайте настроим регион кеша и выполним запрос:
<?php
namespace App\Controller;
use App\Entity\Article;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route;
class ArticleController extends AbstractController
{
#[Route('/article/{id}', name: 'article_show')]
public function show(int $id, EntityManagerInterface $em): Response
{
$repository = $em->getRepository(Article::class);
$article = $repository->find($id);
return new Response($article->getTitle());
}
}
?>
Первый вызов метода find выполнит SQL-запрос
и положит результат в кеш. Второй вызов вернёт
сущность из региона без обращения к базе данных.
Смотрите также
-
атрибут
Entity,
который помечает класс как сущность Doctrine -
атрибут
Table,
который задаёт имя таблицы для сущности -
атрибут
Id,
который помечает поле первичным ключом -
атрибут
GeneratedValue,
который включает автоинкремент для первичного ключа