Страница ошибки Symfony, только когда внутри пользовательского маршрута

В настоящее время я разрабатываю пакет многократного использования, в котором я делаю дополнительные маршруты (устанавливается внутри 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 }

Теперь все работает нормально, отображаются все страницы ошибок пользовательских пакетов. Но они показываются везде, даже в основном приложении маршрут не проходит.

Как разделить, когда показывать страницы ошибок приложения и когда показывать пользовательские пакеты?

1

Решение

Я собираюсь предположить, что вы хотите другую страницу 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 */
}
2

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector