Урок 3: Контроллеры в Symfony. Создание, методы, ответы

Приветствую вас в третьем уроке нашего курса по Symfony. Сегодня мы погрузимся в сердце любого Symfony-приложения, это контроллеры. Именно здесь обрабатываются запросы, формируются ответы и связываются воедино модели, шаблоны и логика приложения.

Создание первого контроллера

Контроллер это класс, который обрабатывает HTTP-запросы и возвращает HTTP-ответы. В Symfony контроллеры находятся в директории src/Controller.

Шаг 1: Генерация контроллера через консоль

Symfony предоставляет удобную консольную команду для создания контроллеров:

bash
php bin/console make:controller FirstController

Эта команда создаст:

  • Класс FirstController в src/Controller/FirstController.php.
  • Шаблон templates/first/index.html.twig.

Шаг 2: Ручное создание контроллера

Если вы предпочитаете писать код вручную, вот пример простого контроллера:

php
// src/Controller/FirstController.php
namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;

class FirstController extends AbstractController
{
    public function hello(): Response
    {
        return new Response('Привет, Symfony!');
    }
}

Что здесь происходит:

  • Класс наследуется от AbstractController, что даёт доступ к полезным методам (например, рендеринг шаблонов).
  • Метод hello() возвращает объект Response с текстом.

Методы действий (Action Methods)

Методы действий это публичные методы контроллера, которые обрабатывают запросы. Каждый метод соответствует определённому маршруту.

Параметры действий

Symfony автоматически передаёт в методы зависимости и данные запроса. Например:

php
public function showPost(Request $request, int $id): Response
{
    // Получаем ID из URL
    $post = $this->getPostById($id); // Ваш метод для получения данных

    return $this->render('post/show.html.twig', [
        'post' => $post,
    ]);
}

Разберём параметры:

  • Request $request: Объект запроса (GET/POST параметры, заголовки).
  • int $id: Переменная из маршрута (например, /post/{id}).

Ответы: JSON, редиректы, рендеринг шаблонов

JSON-ответ

Используйте JsonResponse для возврата данных в формате JSON:

php
use Symfony\Component\HttpFoundation\JsonResponse;

public function apiData(): JsonResponse
{
    $data = [
        'name' => 'Максим',
        'course' => 'Symfony для начинающих',
    ];

    return $this->json($data);
}

Редирект

Перенаправление на другой маршрут:

php
public function redirectToHello(): RedirectResponse
{
    return $this->redirectToRoute('app_first_hello');
}

Рендеринг шаблона

Создайте шаблон в templates/first/hello.html.twig:

twig
<h1>{{ message }}</h1>

И вызовите его из контроллера:

php
public function renderTemplate(): Response
{
    return $this->render('first/hello.html.twig', [
        'message' => 'Привет из шаблона!',
    ]);
}

Взаимодействие между контроллерами и маршрутами

Маршруты определяют, какой метод контроллера будет вызван для определённого URL.

Варианты определения маршрутов

Через атрибуты (рекомендуется):

php
use Symfony\Component\Routing\Annotation\Route;

class FirstController extends AbstractController
{
    #[Route('/hello', name: 'app_first_hello')]
    public function hello(): Response
    {
        // ...
    }
}

Через YAML-конфиг (config/routes.yaml):

yaml
app_first_hello:
    path: /hello
    controller: App\Controller\FirstController::hello

С параметрами:

php
#[Route('/post/{id}', name: 'app_post_show')]
public function showPost(int $id): Response
{
    // ...
}

Практические задачи

Задача 1: Создайте контроллер BlogController

  1. Сгенерируйте его через make:controller.
  2. Добавьте метод index(), который возвращает текст «Список статей».
  3. Настройте маршрут /blog.

Решение:

php
// src/Controller/BlogController.php
#[Route('/blog', name: 'app_blog_index')]
public function index(): Response
{
    return new Response('Список статей');
}

Задача 2: Реализуйте JSON-API

Создайте маршрут /api/user, который возвращает JSON:

json
{ "username": "Максим", "role": "преподаватель" }

Решение:

php
#[Route('/api/user', name: 'app_api_user')]
public function apiUser(): JsonResponse
{
    return $this->json([
        'username' => 'Максим',
        'role' => 'преподаватель',
    ]);
}

Сегодня вы научились создавать контроллеры, работать с ответами и связывать их с маршрутами. Это основа любого Symfony-приложения. Продолжайте обучение: полный курс по Symfony для начинающих