Кастомная страница 404?

В Symfony есть несколько способов создания кастомной страницы 404, которая будет отображаться, когда запрашиваемый URL не соответствует ни одному маршруту в приложении.

Один из способов - использовать ExceptionListener. Этот слушатель событий будет перехватывать исключение NotFoundHttpException, которое генерируется Symfony, когда нет соответствующего маршрута для запрашиваемого URL. В его методе onKernelException() вы можете определить, какую страницу 404 показать пользователю:

// src/EventListener/ExceptionListener.php
namespace AppEventListener;

use SymfonyComponentHttpFoundationResponse;
use SymfonyComponentHttpKernelEventExceptionEvent;
use SymfonyComponentHttpKernelExceptionNotFoundHttpException;
use TwigEnvironment;

class ExceptionListener
{
    private $twig;

    public function __construct(Environment $twig)
    {
        $this->twig = $twig;
    }

    public function onKernelException(ExceptionEvent $event)
    {
        $exception = $event->getThrowable();

        if ($exception instanceof NotFoundHttpException) {
            $response = new Response(
                $this->twig->render('404.html.twig'),
                Response::HTTP_NOT_FOUND
            );

            $event->setResponse($response);
        }
    }
}

Затем вам нужно зарегистрировать этот слушатель событий в вашем файле конфигурации сервисов (например, services.yaml):

# app/config/services.yaml
services:
    AppEventListenerExceptionListener:
        arguments: ['@twig']
        tags:
            - { name: kernel.event_listener, event: kernel.exception }

И создать шаблон Twig для страницы 404 (например, 404.html.twig):

{# templates/404.html.twig #}

{% extends 'base.html.twig' %}

{% block content %}
    <h1>Страница не найдена</h1>
    <p>Извините, запрашиваемая вами страница не найдена.</p>
{% endblock %}

Когда Symfony обнаруживает NotFoundHttpException, ExceptionListener будет вызываться, и страница 404 будет отображаться пользователю.

Также можно использовать связанный шаблон ошибки, который показывает страницу 404 при ошибке 404:

{# templates/bundles/TwigBundle/Exception/error404.html.twig #}

{% extends 'base.html.twig' %}

{% block body %}
    <h1>Страница не найдена</h1>
    <p>Извините, запрашиваемая вами страница не найдена.</p>
{% endblock %}

В этом случае вам не нужно писать свой ExceptionListener, Symfony автоматически использует этот шаблон, когда выполняется 404 ошибка. Вы можете настроить другие шаблоны ошибок для разных типов исключений.

Это только один из способов создания кастомной страницы 404 в Symfony. Остальные способы включают переопределение шаблона ошибки или обработку в контроллере. Конкретный способ выбирается в зависимости от требований вашего проекта и вашего подхода в разработке.