Контроллеры
Контроллер получает запрос и возвращает ответ — всегда объект Response. Базовый класс AbstractController даёт короткие методы для частых задач: показать шаблон, перенаправить, вернуть JSON.
Создание
php bin/console make:controller BlogControllerКоманда создаст класс и шаблон к нему:
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route;
class BlogController extends AbstractController
{
#[Route('/blog', name: 'blog_index')]
public function index(): Response
{
return $this->render('blog/index.html.twig', [
'title' => 'Блог',
]);
}
}render() находит шаблон в папке templates и передаёт ему переменные.
Запрос
Данные запроса лежат в объекте Request. Достаточно добавить его в аргументы метода:
use Symfony\Component\HttpFoundation\Request;
#[Route('/search', name: 'search')]
public function search(Request $request): Response
{
$query = $request->query->get('q', '');
$page = $request->query->getInt('page', 1);
return new Response("Ищем: $query, страница $page");
}| Свойство | Что содержит |
|---|---|
$request->query | Параметры адреса после ? |
$request->request | Поля формы, отправленной методом POST |
$request->files | Загруженные файлы |
$request->headers | Заголовки |
$request->cookies | Cookie |
Перенаправление
return $this->redirectToRoute('blog_show', ['slug' => 'first-post']);JSON
#[Route('/api/status', name: 'api_status')]
public function status(): Response
{
return $this->json(['status' => 'ok', 'time' => time()]);
}Ошибка 404
#[Route('/blog/{slug}', name: 'blog_show')]
public function show(string $slug, PostRepository $posts): Response
{
$post = $posts->findOneBy(['slug' => $slug]);
if (!$post) {
throw $this->createNotFoundException('Статья не найдена');
}
return $this->render('blog/show.html.twig', ['post' => $post]);
}PostRepository в аргументах — сервис: Symfony сам передаст нужный объект по типу.
Сообщения после действия
Сообщение сохраняется в сессии и показывается один раз — на следующей странице:
$this->addFlash('success', 'Статья сохранена');
return $this->redirectToRoute('blog_index');{% for message in app.flashes('success') %}
<div class="alert">{{ message }}</div>
{% endfor %}Частая ошибка
Метод контроллера обязан вернуть объект Response. Если забыть return перед $this->render(...) или вернуть строку либо массив, Symfony сообщит: The controller must return a "Response" object. Указывайте тип : Response у каждого метода — тогда ошибку покажет ещё редактор.