В настоящее время я разрабатываю пакет многократного использования, в котором я делаю дополнительные маршруты (устанавливается внутри routing.yml +, загруженный механизмом Routing Loader). Все начинается с /admin
(да, это пакет администратора). В настоящее время в моем веб-приложении есть своя собственная страница 404 (основная). И я пытаюсь сделать так, что если пользователь находится внутри ошибки пакета администратора, он увидит еще одну страницу с ошибкой.
Я сделал это с моим собственным обычаем ExceptionListener
(внутри пользовательского пакета администратора!) следующим образом
class ExceptionListener
{
//...
public function onKernelException(GetResponseForExceptionEvent $event)
{
$exception = $event->getException();
$response = new Response();
//...
$response->setContent($this->templating->render($templateName, [
'statusCode' => $response->getStatusCode(),
'page' => $page
]));
$event->setResponse($response);
}
}
и в связке services.yml
:
admin.exception_listener:
class: ....\EventListener\ExceptionListener
calls:
- ["setTemplating", ["@templating"]]
- ["setKernel", ["@kernel"]]
tags:
- { name: kernel.event_listener, event: kernel.exception }
Теперь все работает нормально, отображаются все страницы ошибок пользовательских пакетов. Но они показываются везде, даже в основном приложении маршрут не проходит.
Как разделить, когда показывать страницы ошибок приложения и когда показывать пользовательские пакеты?
Я собираюсь предположить, что вы хотите другую страницу 404, если пользователь пытается посетить маршрут, который начинается с /admin
но не существует Вы можете сделать это в своем onKernelException()
метод через:
$request = $event->getRequest();
// check if request starts with /admin
if (substr($request->getRequestUri(), 0, strlen('/admin')) === '/admin') {
// load admin 404 template
$response->setContent(/* ... */);
} else {
// load site 404 template
$response->setContent(/* ... */);
}
$event->setResponse($response);
Я также заметил, что вы явно не проверяете страницу 404, что вы, вероятно, должны сделать через:
if ($exception instanceof NotFoundHttpException) {
/* set your template response here */
}
Других решений пока нет …