Laravel - 为 WEB 艺术家创造的 PHP 框架。

PHP THAT DOESN'T HURT. CODE HAPPY & ENJOY THE FRESH AIR.

Laravel logo

Laravel 5.0 系列 - 定制错误页

当你想在 Laravel 4 中定制错误页时(404页面) -- 例如,展示一张特别的喵星人图片,你可以参考: Dries Vints 写的这篇文章.

而在 Laravel 5 中,有些事情变得不一样了。直接查看解决方案

在代码中追踪执行流程

在 Laravel 5 中,所有自定义的错误和异常的处理都集中在 app/Exceptions/Handler.php 文件中了。是否还记得这就是我们添加 whoops 包 的地方。

请注意,默认行为如下:

    /**
     * 在 HTTP 响应中回执异常页面
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Exception  $e
     * @return \Illuminate\Http\Response
     */
    public function render($request, Exception $e)
    {
        if ($this->isHttpException($e))
        {
            return $this->renderHttpException($e);
        }
        else
        {
            return parent::render($request, $e);
        }
    }

对于所有的 HTTP 异常(例如状态码 404 和 503),调用的是 renderHttpException() 方法,但是,此方法的实际定义的位置并不在这个文件中,所以,我们需要查看一下它的父类 \Illuminate\Foundation\Exceptions\Handler所对应的文件,在这里就能找到 renderHttpException() 方法了:

 /**
     * Render the given HttpException.
     *
     * @param  \Symfony\Component\HttpKernel\Exception\HttpException  $e
     * @return \Symfony\Component\HttpFoundation\Response
     */
    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}" 命名的视图(view),就会被加载并展示出来(这个视图文件还会接收到一些参数)。

实战

因此,如果你定义了 “errors.{errorStatusCode}” 方式命名的视图,框架就会自动根据 errorStatusCode(错误状态码) 绘制并展示出来。

知道了原理,接下来定制 404 错误页就简单了,只要将视图文件放到如下路径就行了:

resources/views/errors/404.blade.php

搞定收工!


原文地址:https://mattstauffer.co/blog/laravel-5.0-custom-error-pages

关于作者 王赛
源码面前,了无秘密。