Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Контроллеры

Контроллер получает запрос и возвращает ответ — всегда объект 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->cookiesCookie

Перенаправление

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 у каждого метода — тогда ошибку покажет ещё редактор.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.