Атрибут MapEntity
Атрибут MapEntity вешается на параметр метода
контроллера. Он автоматически находит сущность
в базе данных по значению, переданному из запроса,
и подставляет её в аргумент. Первым параметром
передаётся класс сущности. Если сущность не найдена,
Symfony выбрасывает исключение 404.
Синтаксис
#[MapEntity(class: EntityClass::class)]
Пример
Давайте создадим сущность Article с полями
id и title:
<?php
namespace AppEntity;
use AppRepositoryArticleRepository;
use DoctrineORMMapping as ORM;
#[ORMEntity(repositoryClass: ArticleRepository::class)]
class Article
{
#[ORMId]
#[ORMGeneratedValue]
#[ORMColumn(type: 'integer')]
private ?int $id = null;
#[ORMColumn(type: 'string', length: 255)]
private string $title;
public function getId(): ?int
{
return $this->id;
}
public function getTitle(): string
{
return $this->title;
}
public function setTitle(string $title): static
{
$this->title = $title;
return $this;
}
}
?>
Теперь повесим атрибут MapEntity на параметр
метода контроллера. Symfony сам найдёт статью
по id из URL:
<?php
namespace AppController;
use AppEntityArticle;
use SymfonyBundleFrameworkBundleAttributeMapEntity;
use SymfonyBundleFrameworkBundleControllerAbstractController;
use SymfonyComponentHttpFoundationResponse;
use SymfonyComponentRoutingAttributeRoute;
class ArticleController extends AbstractController
{
#[Route('/article/{id}', name: 'article_show')]
public function show(#[MapEntity(class: Article::class)] Article $article): Response
{
return new Response($article->getTitle());
}
}
?>
Результат выполнения кода для адреса /article/1:
"article"
Пример
Давайте укажем поле, по которому искать сущность,
с помощью параметра mapping:
<?php
namespace AppController;
use AppEntityArticle;
use SymfonyBundleFrameworkBundleAttributeMapEntity;
use SymfonyBundleFrameworkBundleControllerAbstractController;
use SymfonyComponentHttpFoundationResponse;
use SymfonyComponentRoutingAttributeRoute;
class ArticleController extends AbstractController
{
#[Route('/article/title/{title}', name: 'article_by_title')]
public function showByTitle(
#[MapEntity(class: Article::class, mapping: ['title' => 'title'])] Article $article
): Response {
return new Response($article->getTitle());
}
}
?>
Результат выполнения кода для адреса /article/title/hello:
"hello"
Пример
Если сущность не найдена, Symfony вернёт ошибку 404.
Давайте обработаем этот случай через параметр
message:
<?php
namespace AppController;
use AppEntityArticle;
use SymfonyBundleFrameworkBundleAttributeMapEntity;
use SymfonyBundleFrameworkBundleControllerAbstractController;
use SymfonyComponentHttpFoundationResponse;
use SymfonyComponentRoutingAttributeRoute;
class ArticleController extends AbstractController
{
#[Route('/article/{id}', name: 'article_show')]
public function show(
#[MapEntity(class: Article::class, message: 'Article not found')] Article $article
): Response {
return new Response($article->getTitle());
}
}
?>
Результат выполнения кода для несуществующего адреса /article/999:
"Article not found"
Смотрите также
-
атрибут
MapQueryParameter,
который подставляет параметр из query-строки -
атрибут
MapQueryString,
который преобразует query-строку в DTO -
атрибут
MapRequestPayload,
который преобразует тело запроса в DTO -
атрибут
MapUploadedFile,
который подставляет загруженный файл