[译]Laravel 5.0 之自定义错误页面

时间:2022-05-02
本文章向大家介绍[译]Laravel 5.0 之自定义错误页面,主要内容包括源代码解析、如何实现自定义、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。

本文译自 Matt Stauffer 的系列文章.


在以往版本的 Laravel 中,假如你想自定义错误页面——比如当用户访问不存在的页面时显示一张猫的 GIF 动画图片——你可能会通过 Google 进行搜索,然后找到 Dries Vints 写的这个文档

在 Laravel 5 中,这个问题得到了改进。>>直达解决方案

源代码解析

在新版本的 Laravel 中,所以处理自定义错误和异常的代码都移到了 app/Exceptions/Handler.php 里。如果你读了之前的 bring Whoops back, 你应该还记得就是通过这里的代码实现的。

但阅读代码时你可能发现了,默认是这样处理的:

/**
     * Render an exception into an HTTP response.
     *
     * @param  IlluminateHttpRequest  $request
     * @param  Exception  $e
     * @return IlluminateHttpResponse
     */
    public function render($request, Exception $e)
    {
        if ($this->isHttpException($e))
        {
            return $this->renderHttpException($e);
        }
        else
        {
            return parent::render($request, $e);
        }
    }

对所有的 HTTP 异常(比如 404 或者 503 这样的异常),它用 renderHttpException() 方法来处理,而这个方法并不是在这个文件中定义的。所以我们继续追溯到它的父类,IlluminateFoundationExceptionsHandler, 在这个类里面,我们找到了 renderHttpException() 方法的代码:

/**
     * Render the given HttpException.
     *
     * @param  SymfonyComponentHttpKernelExceptionHttpException  $e
     * @return SymfonyComponentHttpFoundationResponse
     */
    protected function renderHttpException(HttpException $e)
    {
        if (view()->exists('errors.'.$e->getStatusCode()))
        {
            return response()->view('errors.'.$e->getStatusCode(), [], $e->getStatusCode());
        }
        else
        {
            return (new SymfonyDisplayer(config('app.debug')))->createResponse($e);
        }
    }

所以,如果存在 errors.{httpStatusCode} 的视图,它就会直接显示该视图(并且传入一些必要的信息)。

如何实现自定义

#

根据前文的分析,如果我们创建了一个名为 "errors.{errorStatusCode}" 的视图,当对应的异常码出现时,系统就会自动显示这个视图。

那么我们要做的事情就太简单了。比如你想自定义 404 错误页面的话,只要创建一个 resources/views/errors/404.blade.php 的视图文件,就可以了!