De forma predeterminada , Laravel busca vistas de error en resources/views/errors y devuelve la vista correspondiente para el código de estado relevante, p. 404 o 403. En lugar de crear todas estas vistas manualmente, quiero usar mi propia vista personalizada para todos los códigos de error, con el código de error real y el mensaje mostrado dinámicamente en la vista usando getMessage() y cualquier otra función auxiliar que pueda estar disponible para me.
Esto me permitiría hacer esto normalmente:
abort(<statuscode>, <mymessage>)... pero siempre devuelve solo una vista.
Tenga en cuenta que lo que estoy preguntando no es lo mismo que lo que se solicita aquí , que es forzar todos los errores a 404 sin importar su código de estado real. Quiero mantener los códigos de estado como deberían ser, simplemente mostrarlos todos en la misma vista.
En el controlador de excepciones predeterminado , un método llamado getHttpExceptionView() determina la vista que se devolverá. Simplemente anúlelo en su clase App\Exceptions\Handler con la lógica deseada.
use Symfony\Component\HttpKernel\Exception\HttpExceptionInterface; protected function getHttpExceptionView($e) { if ($e->getStatusCode() === 409) { return "exceptions.special"; } return "exceptions.default"; }Está devolviendo una ruta de vista estándar, separada por puntos si está usando directorios.
Como se describe en la respuesta de miken32 , agregué lo siguiente al final de la clase Handler dentro del archivo App\Exceptions\Handler.php :
class Handler extends ExceptionHandler { // Default classes // ... protected function getHttpExceptionView($e) { // 409 errors are handled specially // Remove this if block entirely to serve them with the same error page as below if ($e->getStatusCode() === 409) { return "exceptions.special"; } return "errors.custom"; // Return a "custom" file under "resources/views/errors" } }Luego agregué lo siguiente a mi vista de error:
<h1 class="primary-header"> @if($exception) {{"Error " . $exception->getStatusCode().":"}} {{ $exception->getMessage() ? $exception->getMessage() : "page not found" }} @else {{ "Generic error: page not found" }} @endif </h1> Esto ahora me permite usar la función abort() en un controlador, por ejemplo, para lanzar cualquier código de error HTTP con un mensaje opcional:
Route::get("/failtest/", function (){ abort(404, "someone messed up"); });