Контроллеры в Symfony
Контроллер
Контроллер — это метод , который находится внутри класса контроллера
// 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
Создание контроллеров
Чтобы сэкономить время, можно использовать Symfony Maker, чтобы автоматически сгенерировать новый класс контроллера
https://symfony.com/bundles/SymfonyMakerBundle/current/index.html
#Создать контроллер и шаблон
php bin/console make:controller BrandNewController
#Если вы хотите создать полноценный CRUD на основе Doctrine entity, используйте:
php bin/console make:crud Product
created: src/Controller/ProductController.php
created: src/Form/ProductType.php
created: templates/product/_delete_form.html.twig
created: templates/product/_form.html.twig
created: templates/product/edit.html.twig
created: templates/product/index.html.twig
created: templates/product/new.html.twig
created: templates/product/show.html.twig
Обработка ошибок и страниц с ошибкой 404






