createnotfoundexception create symfony

symfony createnotfoundexception



Mostrar una ruta específica en lugar de la página de error(404)-Symfony2 (2)

Como se muestra en el Cookbook de Symfony , puede anular las páginas de error de dos maneras:

  • Sobreescribiendo las plantillas
  • Usando un controlador de excepción personalizado

Si solo desea mostrar la ruta /sitemap en una excepción 404 ( HttpNotFoundException ), puede anular la plantilla de excepción Twig creando una nueva plantilla en la app/Resources/TwigBundle/views/Exception/error404.html.twig .

Otra forma que no se muestra en el libro de cocina es usar un detector de eventos. Cuando el kernel encuentra una excepción, se kernel.exception un evento kernel.exception . Por defecto, esta excepción es capturada por la escucha de excepción proporcionada por Twig. Puede crear su propio oyente de eventos que escuche el evento kernel.exception y represente una página:

<?php use Symfony/Component/HttpKernel/Exception/NotFoundHttpException; use Symfony/Component/HttpKernel/Event/GetResponseForExceptionEvent; use Symfony/Component/HttpFoundation/Response; public function onKernelException(GetResponseForExceptionEvent $event) { if ($event->getException() instanceof NotFoundHttpException) { $response = $this->templating->renderResponse(/* sitemap */); $event->setResponse($response) } }

(No he probado este código, ¡así que debes probarlo tú mismo! Y tienes que inyectar el servicio de creación de plantillas en el oyente del evento, por supuesto).

En lugar de una página de error / 404, solo quiero mostrar la página / sitemap. Por supuesto, no quiero una redirección y aún quiero que se establezca el encabezado de respuesta HTTP 404.

es posible? Todo lo que puedo ver es cómo configurar plantillas en Twig.

Definitivamente no quiero una redirección.


Tengo una aplicación web simple compuesta por varios paquetes de Symfony3, cuyos controladores extienden un BaseController. También tengo un AdminBundle. Para mostrar una página determinada por cada url no existente, pirateé (y simplifiqué) el ExceptionController.php original (del TwigBundle):

<?php namespace MyApp/AdminBundle/Controller; use Symfony/Bundle/FrameworkBundle/Controller/Controller; use Symfony/Component/HttpFoundation/Response; use Symfony/Component/HttpFoundation/Request; use Sensio/Bundle/FrameworkExtraBundle/Configuration/Method; use Sensio/Bundle/FrameworkExtraBundle/Configuration/Route; use Sensio/Bundle/FrameworkExtraBundle/Configuration/Template; use MyApp/Controller/BaseController; use Symfony/Component/Debug/Exception/FlattenException; use Symfony/Component/HttpKernel/Log/DebugLoggerInterface; class ExceptionController extends BaseController { /** * Converts an Exception to a Response. * * @param Request $request The request * @param FlattenException $exception A FlattenException instance * @param DebugLoggerInterface $logger A DebugLoggerInterface instance * * @return Response * @throws /InvalidArgumentException When the exception template does not exist */ public function showAction(Request $request, FlattenException $exception, DebugLoggerInterface $logger = null) { $currentContent = $this->getAndCleanOutputBuffering($request->headers->get(''X-Php-Ob-Level'', -1)); $code = $exception->getStatusCode(); return $this->render(''MyappAdminBundle:Admin:error.html.twig'', array( ''status_code'' => $code, ''status_text'' => isset(Response::$statusTexts[$code]) ? Response::$statusTexts[$code] : '''', ''exception'' => $exception, ''logger'' => $logger, ''currentContent'' => $currentContent, ) ); } /** * @param int $startObLevel * * @return string */ protected function getAndCleanOutputBuffering($startObLevel) { if (ob_get_level() <= $startObLevel) { return ''''; } Response::closeOutputBuffers($startObLevel + 1, true); return ob_get_clean(); } }

Defino mi plantilla de error como me gustó.

Necesito agregar la siguiente línea dentro de config.yml

twig: exception_controller: MyappAdminBundle:Exception:show

ps. Estoy seguro de que mi código puede mejorarse, pero funciona bien.