资讯专栏INFORMATION COLUMN

Lumen如何实现类Laravel5用户友好的错误页面

Vicky / 2802人阅读

摘要:实现用户友好的错误页面非常简单,例如想要返回,只需要在中添加一个文件即可。如何实现类用户友好的错误页面原理抛出错误的函数是进入该函数一看究竟,会发现只是抛出一个在中,处理的时候,有一个的过程,就是在这里被捕获的。

Laravel5实现用户友好的错误页面非常简单,例如想要返回status 404,只需要在view/errors中添加一个404.blade.php文件即可。Lumen中没有默认实现这种便利,于是自己添加一个。

Lumen如何实现类Laravel5用户友好的错误页面 原理

抛出错误的函数是abort(), 进入该函数一看究竟,会发现只是抛出一个HttpException. 在Application中,处理http request的时候,有一个try catch的过程,Exception就是在这里被捕获的。

try {
    return $this->sendThroughPipeline($this->middleware, function () use ($method, $pathInfo) {
        if (isset($this->routes[$method.$pathInfo])) {
            return $this->handleFoundRoute([true, $this->routes[$method.$pathInfo]["action"], []]);
        }

        return $this->handleDispatcherResponse(
            $this->createDispatcher()->dispatch($method, $pathInfo)
        );
    });
} catch (Exception $e) {
    return $this->sendExceptionToHandler($e);
}

接着可以看出,Exception是交给了sendExceptionToHandler去处理了。这里的handler具体是哪个类呢?是实现了IlluminateContractsDebugExceptionHandler的一个单例。为啥说他是单例?因为在bootstrap的时候,已经初始化为单例了,请看。

$app->singleton(
    IlluminateContractsDebugExceptionHandler::class,
    AppExceptionsHandler::class
);

进入该类看一下,他有一个render方法,好吧,找到问题所在了,修改一下这个方法即可。

public function render($request, Exception $e)
{
    return parent::render($request, $e);
}
动手修改

由于Laravel已经有实现了,所以最简便的方法就是复制黏贴。在render中先判断下是否为HttpException, 如果是,就去errors目录下找对应status code的view,如果找到,就渲染它输出。就这么简单。修改Handler如下:

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

/**
 * Render the given HttpException.
 *
 * @param  SymfonyComponentHttpKernelExceptionHttpException  $e
 * @return SymfonyComponentHttpFoundationResponse
 */
protected function renderHttpException(HttpException $e)
{
    $status = $e->getStatusCode();

    if (view()->exists("errors.{$status}"))
    {
        return response(view("errors.{$status}", []), $status);
    }
    else
    {
        return (new SymfonyExceptionHandler(env("APP_DEBUG", false)))->createResponse($e);
    }
}

/**
 * Determine if the given exception is an HTTP exception.
 *
 * @param  Exception  $e
 * @return bool
 */
protected function isHttpException(Exception $e)
{
    return $e instanceof HttpException;
}

好了,在errors目录下新建一个404.blade.php文件,在controller中尝试 abort(404)看一下吧。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/21124.html

相关文章

  • 如何Lumen中使用Elasticsearch

    摘要:之前受到这篇为你的站点插上的翅膀的启发就尝试在中引入,并完成中文索引。关于中文索引谷歌上关于中文搜索的文章有很多,例如这篇。中文索引中涉及的内容比较多,下次再用一个篇幅来分析。 如何在Lumen中使用Elasticsearch 前言 Lumen是基于Laravel核心组件的微框架,随着Laravel5的发布,目前版本也已经到5了。之前受到这篇为你的站点插上ElasticSearch...

    jubincn 评论0 收藏0
  • windows下laravel5.5手写教程1(适合初学者)

    摘要:打开浏览器输入,如无意外,将出现如下图,表示框架安装成功。四系统内部后台管理系统这个是框架自带的后台登录管理系统,只需要简单的命令即可运行。出现上图即为,创建模型成功。 在PHP个各种web开发框架中,laravel算是一款简洁、优雅的开发框架,本人也刚刚接触到laravel,通过学习大神们的一些文章,下面是我的一些心得体会,希望可以给初学者一些帮助,大家一起进步。言归正传: 本人环境...

    GeekGhc 评论0 收藏0
  • 基于 lumen 微服务架构实践

    摘要:现在的提供了一种更易于使用和维护的计划任务方式。注意事项建议开启这样会极大的加速类的加载。 lumen 为速度而生的 Laravel 框架 官网的介绍很简洁,而且 lumen 确实也很简单,我在调研了 lumen 相关组件(比如缓存,队列,校验,路由,中间件和最重要的容器)之后认为已经能够满足我目前这个微服务的需求了。 任务目标 showImg(https://segmentfault...

    hatlonely 评论0 收藏0
  • Lumen框架“服务容器”源码解析

    摘要:下边是服务容器工作示意图服务容器的产生框架中,服务容器是由中类完成的,该类实现了服务容器的核心功能。并不是框架中所有的类都能实现自动依赖注入的功能只有服务容器创建的类实例才能实现依赖自动注入。框架中的服务容器是全局的,不需要 1.服务容器 服务容器是Lumen框架整个系统功能调度配置的核心,它提供了整个框架运行过程中的一系列服务。服务容器就是提供服务(服务可以理解为系统运行中需要的东西...

    ytwman 评论0 收藏0

发表评论

0条评论

Vicky

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<