Класс EntityManager
Класс EntityManager является центральным объектом
Doctrine ORM в Symfony. Он отвечает за сохранение,
удаление, поиск и обновление сущностей, а также
управляет состоянием объектов в Unit of Work.
Экземпляр EntityManager доступен в контроллерах
через сервис doctrine.orm.entity_manager
или через автоинъекцию EntityManagerInterface.
Основные возможности: persist - планирует
сохранение сущности, flush - синхронизирует
изменения с базой данных, remove - помечает
сущность на удаление, find - ищет сущность
по первичному ключу, getRepository -
возвращает репозиторий сущности.
Синтаксис
use Doctrine\ORM\EntityManagerInterface;
public function index(EntityManagerInterface $em): Response
{
// работа с EntityManager
}
Пример
Давайте получим EntityManager через автоинъекцию
и создадим новую сущность:
<?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/create', name: 'article_create')]
public function create(EntityManagerInterface $em): Response
{
$article = new Article();
$article->setTitle('abcde');
$article->setText('article text');
$em->persist($article);
$em->flush();
return new Response('saved');
}
}
?>
Результат выполнения кода:
"saved"
Пример
Давайте найдём сущность по её идентификатору и обновим её поле:
<?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/update/{id}', name: 'article_update')]
public function update(int $id, EntityManagerInterface $em): Response
{
$article = $em->find(Article::class, $id);
if (!$article) {
return new Response('not found');
}
$article->setTitle('hello');
$em->flush();
return new Response($article->getTitle());
}
}
?>
Результат выполнения кода для адреса /article/update/1:
"hello"
Пример
Давайте удалим сущность через remove
и flush:
<?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/delete/{id}', name: 'article_delete')]
public function delete(int $id, EntityManagerInterface $em): Response
{
$article = $em->find(Article::class, $id);
if (!$article) {
return new Response('not found');
}
$em->remove($article);
$em->flush();
return new Response('deleted');
}
}
?>
Результат выполнения кода для адреса /article/delete/1:
"deleted"
Пример
Давайте получим репозиторий сущности и найдём все записи:
<?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/all', name: 'article_all')]
public function all(EntityManagerInterface $em): Response
{
$repository = $em->getRepository(Article::class);
$articles = $repository->findAll();
$titles = [];
foreach ($articles as $article) {
$titles[] = $article->getTitle();
}
return new Response(implode(', ', $titles));
}
}
?>
Результат выполнения кода:
"article 1, article 2, article 3"
Смотрите также
-
метод
persist,
который планирует сохранение сущности -
метод
flush,
который синхронизирует изменения с базой данных -
метод
remove,
который помечает сущность на удаление -
метод
getRepository,
который возвращает репозиторий сущности