Видео актуально для Symfony 7 

Что такое Controller в Symfony 7?

На текущий момент в нашем Symfony проекте еще нет ни одного адреса, куда бы пользователь мог обратиться. Ранее мы создавали файлы в папке public, но это не правильный вариант создания адресов. Мы не можем в папке public прописывать какую-то логику.

Для того, чтобы пользователь мог обратиться по каким-либо адресам, мы должны создать controller (контроллер) и роут (route).

Controller - это специальный класс, который будет принимать входные запросы от наших пользователей и выдавать какой-то ответ.

Контроллер состоит из PHP методов и если на PHP методом стоит специальная конструкция, она становиться роутом. 

routes (роуты) - это пути, куда этот пользователь может обращаться. Т.е. controller в Symfony состоит из роутов.

Например,

#[Route('/main', name: 'app_main')]

Благодаря такой конструкции Symfony узнает по какому адресу нужно обратиться, чтобы получить доступ к тому или иному методу в контроллере. Это и есть создание роута.

Чтобы увидеть эту страницу в браузере, мы можем обратиться по адресу:

https://site.ru/main

Роуты - это контрольные точки в контроллере, куда могут обращаться наши пользователи.

Создание controller в Symfony 7

Давайте создадим свой первый роут и контроллер в нашем проекте Symfony.

Чтобы создать новый контроллер, в терминале выполняем команду:

php bin/console make:controller

Нам нужно придумать имя для будущего контроллера. Важно, чтобы это имя оканчивалось на …Controller. Например, можно указать MainController.

После выполнения этой команды в папке src/Controller нашего проекта должен появиться новый PHP класс с названием MainController.

Примечание

Если нужно создать контроллер без системы рендеринга (например, все роуты контроллера будут возвращать json ответ), можно использовать следующую команду для создания контроллера (преффикс --no-template):

php bin/console make:controller --no-template ApiLogin

В итоге, мы получим примерно вот такой роут в этом контроллере

<?php

namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\Routing\Attribute\Route;

class ApiLoginController extends AbstractController
{
#[Route('/api/login', name: 'app_api_login')]
public function index(): JsonResponse
{
return $this->json([
'message' => 'Welcome to your new controller!',
'path' => 'src/Controller/ApiLoginController.php',
]);
}
}

Базовый класс контроллеров в Symfony 7

Каждый класс контроллера в Symfony расширяет базовый класс AbstractController (use Symfony\Bundle\FrameworkBundle\Controller\AbstractController). Это дает возможность использовать в методах этого класса специальные методы родительского абстрактного  компонента контроллера.

Это очень удобно, т.к. нам не нужно каждый раз подгружать новые сервисы, чтобы делать наиболее часто встречаемые действия.

Ответ controller

Контроллер обязательно должен возвращать какой-то ответ с помощью оператора return. Если этого не сделать, мы получим ошибку. Чаще всего в качестве ответа отдается либо HTML-разметка документа, либо ответ в формате JSON, но также мы можем отдать csv документ или любой другой формат данных доступный по протоколу HTTP.

Кроме того, controller может не возвращать какой-то ответ, а делать редирект на какой-то другой роут.

Таким образом мы с вами создали наш первый роут и controller (контроллер) Symfony. Давайте пока на этом остановимся и продолжим в следующем уроке.