Приветствую вас в третьем уроке нашего курса по Symfony. Сегодня мы погрузимся в сердце любого Symfony-приложения, это контроллеры. Именно здесь обрабатываются запросы, формируются ответы и связываются воедино модели, шаблоны и логика приложения.
Создание первого контроллера
Контроллер это класс, который обрабатывает HTTP-запросы и возвращает HTTP-ответы. В Symfony контроллеры находятся в директории src/Controller
.
Шаг 1: Генерация контроллера через консоль
Symfony предоставляет удобную консольную команду для создания контроллеров:
php bin/console make:controller FirstController
Эта команда создаст:
- Класс
FirstController
вsrc/Controller/FirstController.php
. - Шаблон
templates/first/index.html.twig
.
Шаг 2: Ручное создание контроллера
Если вы предпочитаете писать код вручную, вот пример простого контроллера:
// 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 автоматически передаёт в методы зависимости и данные запроса. Например:
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:
use Symfony\Component\HttpFoundation\JsonResponse; public function apiData(): JsonResponse { $data = [ 'name' => 'Максим', 'course' => 'Symfony для начинающих', ]; return $this->json($data); }
Редирект
Перенаправление на другой маршрут:
public function redirectToHello(): RedirectResponse { return $this->redirectToRoute('app_first_hello'); }
Рендеринг шаблона
Создайте шаблон в templates/first/hello.html.twig
:
<h1>{{ message }}</h1>
И вызовите его из контроллера:
public function renderTemplate(): Response { return $this->render('first/hello.html.twig', [ 'message' => 'Привет из шаблона!', ]); }
Взаимодействие между контроллерами и маршрутами
Маршруты определяют, какой метод контроллера будет вызван для определённого URL.
Варианты определения маршрутов
Через атрибуты (рекомендуется):
use Symfony\Component\Routing\Annotation\Route; class FirstController extends AbstractController { #[Route('/hello', name: 'app_first_hello')] public function hello(): Response { // ... } }
Через YAML-конфиг (config/routes.yaml
):
app_first_hello: path: /hello controller: App\Controller\FirstController::hello
С параметрами:
#[Route('/post/{id}', name: 'app_post_show')] public function showPost(int $id): Response { // ... }
Практические задачи
Задача 1: Создайте контроллер BlogController
- Сгенерируйте его через
make:controller
. - Добавьте метод
index()
, который возвращает текст «Список статей». - Настройте маршрут
/blog
.
Решение:
// src/Controller/BlogController.php #[Route('/blog', name: 'app_blog_index')] public function index(): Response { return new Response('Список статей'); }
Задача 2: Реализуйте JSON-API
Создайте маршрут /api/user
, который возвращает JSON:
{ "username": "Максим", "role": "преподаватель" }
Решение:
#[Route('/api/user', name: 'app_api_user')] public function apiUser(): JsonResponse { return $this->json([ 'username' => 'Максим', 'role' => 'преподаватель', ]); }
Сегодня вы научились создавать контроллеры, работать с ответами и связывать их с маршрутами. Это основа любого Symfony-приложения. Продолжайте обучение: полный курс по Symfony для начинающих