Контроллеры в Symfony
Контроллер
Контроллер — это метод , который находится внутри класса контроллера
Маршрут — это связующее звено между путём запроса и callback-функцией PHP, которая создаёт ответ HTTP для этого запроса.
Эти callback-функции PHP называются "контроллерами"
// src/Controller/LuckyController.php
namespace App\Controller;
//use импортирует класс Response, который должен возвращать контроллер.
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route;
// дополнительный базовый класс контроллера AbstractController
//чтобы получить доступ к вспомогательным методам.
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
//добавляется суффикс Controller
class LuckyController extends AbstractController
{
//Сопоставление маршрута
#[Route('/lucky/number/{max}', name: 'app_lucky_number')]
public function number(int $max): Response
{
$number = random_int(0, $max);
//Контроллер создает и возвращает объект Response
return new Response(
'Lucky number: '.$number.''
);
}
}
Генерация URL-адресов
generateUrl() — это вспомогательный метод, который генерирует URL для заданного маршрута
https://github.com/symfony/symfony/blob/8.0/src/Symfony/Bundle/FrameworkBundle/Controller/AbstractController.php#:~:text=function%20generateUrl
$url = $this->generateUrl('app_lucky_number', ['max' => 10]);
Перенаправление
Если вы хотите перенаправить пользователя на другую страницу, используйте методы redirectToRoute() и redirect()
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Response;
// ...
public function index(): RedirectResponse
{
// redirects to the "homepage" route
return $this->redirectToRoute('homepage');
// redirectToRoute is a shortcut for:
// return new RedirectResponse($this->generateUrl('homepage'));
// does a permanent HTTP 301 redirect
return $this->redirectToRoute('homepage', [], 301);
// if you prefer, you can use PHP constants instead of hardcoded numbers
return $this->redirectToRoute('homepage', [], Response::HTTP_MOVED_PERMANENTLY);
// redirect to a route with parameters
return $this->redirectToRoute('app_lucky_number', ['max' => 10]);
//перенаправляет на маршрут и сохраняет исходные параметры строки запроса
return $this->redirectToRoute('blog_show', $request->query->all());
// redirects to the current route
return $this->redirectToRoute($request->attributes->get('_route'));
// редирект на внешний источник
return $this->redirect('http://symfony.com/doc');
}
Шаблоны рендеринга
Если вы обслуживаете HTML-запрос, вам нужно отобразить шаблон. Метод render() отображает шаблон и помещает его содержимое в объект Response
Подробнее: https://symfony.com/doc/current/templates.html
return $this->render('lucky/number.html.twig', ['number' => $number]);
Получение услуг
Symfony поставляется со множеством полезных классов и функций, называемых сервисами
https://symfony.com/doc/current/service_container.html
Они используются для рендеринга шаблонов, отправки электронных писем, запросов к базе данных и любой другой «работы», которую только можно себе представить.
Если вам нужен сервис в контроллере, укажите в подсказке типа аргумент с именем класса (или интерфейса), и Symfony автоматически внедрит его. Для этого необходимо, чтобы ваш контроллер был зарегистрирован как сервис
use Psr\Log\LoggerInterface;
use Symfony\Component\HttpFoundation\Response;
// ...
#[Route('/lucky/number/{max}')]
public function number(int $max, LoggerInterface $logger): Response
{
$logger->info('We are logging!');
// ...
}
#Список всех сервисов
php bin/console debug:autowiring
Как и в случае со всеми сервисами, в ваших контроллерах можно использовать обычную инъекцию через конструктор.
https://symfony.com/doc/current/service_container.html
Ускорение разработки с помощью бандла Maker
Для генерации контроллеров можно использовать пакет symfony/maker-bundle, который был установлен как часть пакета webapp.
#чтобы посмотреть все доступные генераторы бандла Maker
symfony console list make
Генерация контроллера
Команда создает класс ConferenceController в директории src/Controller/
#Создать контроллер
symfony console make:controller ConferenceController
#[Route('/conference', name: 'app_conference')]
public function index(): Response
{
return $this->render('conference/index.html.twig', [
'controller_name' => 'ConferenceController',
]);
}
С помощью атрибута #[Route('/conference', name: 'app_conference')] метод index() становится контроллером (его объявление вместе с конфигурацией находится непосредственно над кодом).
При переходе в браузере по пути /conference выполняется контроллер, который возвращает HTTP-ответ.
Основная задача контроллера — вернуть объект Response в качестве ответа на HTTP-запрос.
В контроллере можно обычный HTML-код вместо шаблона по умолчанию:
#git commit
#[Route('/', name: 'homepage')]
public function index(): Response
{
- return $this->render('conference/index.html.twig', [
- 'controller_name' => 'ConferenceController',
- ]);
+ return new Response(<<
+
+
+
+ 





