★ 背景
- 还要啥背景,就是觉得不可能用框架自带的 404 界面呗.
- 可能跟之前的版本配置方法有点区别,在此做一下简单的笔记
框架:
ThinkPHP 5.1
,ThinkPHP5.0.20
★ 配置过程
♩. 修改 config.app
文件
- 第一,需要关闭调试模式
// 应用调试模式
'app_debug' => false,
一般在项目的开发过程中,可以设置为
"true"
,但是项目上线部署后,一定要关闭调试模式
-
第二,增加或修改配置项:
http_exception_template
-
如果是
ThinkPHP.5.0
框架,进行修改如下:
'http_exception_template' => [
// 定义404错误的重定向页面地址
404 => APP_PATH . 'index/view/exception_html/404.html',
500 => APP_PATH . 'index/view/exception_html500.html',
],
- 如果是
ThinkPHP.5.1
框架,进行修改如下:
//TODO 自定义异常请求码的页面配置 建议只做非500错误页面
'http_exception_template' =>
[
404 => Env::get('app_path') . 'index/view/exception_html/404.html',
500 => Env::get('app_path') . 'index/view/exception_html/500.html',
],
- 上面的路径配置,对应的文件路径是这样的,同理可以扩展添加其他的请求码配置页:
♪. 静态资源的引用
- 这一点其实没必要讲,我只是给一个参考
- 为了项目的界面设计统一性,至少头部尾部都是一致的,以我为例,将自定义页面的静态文件都放置在了
public/errors
目录下
★ 演示效果
- 在自己的项目链接中,随意输入不能访问的链接,则会出现配置的 404 界面,其他同理显示
★ 500不支持
①. 探讨参考
- 根据以上的操作,其实并不能匹配响应出
500
页面 - 追索源码发现跟
Handle
中的render()
方法有关,进一步分析代码,应该是500
情况不能实例化HttpException
的原因 - 原本试着修改了如下图中的对应代码,但是 框架默认将出错数据都认为了是
500
异常报错,这样一来就不能debug
正常调试程序代码了
- 源代码参考如下:
if ($e instanceof HttpException) {
return $this->renderHttpException($e);
} else {
$response = $this->convertExceptionToResponse($e);
$code = $response->getCode();
if ($code == 500){
$e = new HttpException(500,'The server is dead !',$e);
return $this->renderHttpException($e);
}else{
return $this->convertExceptionToResponse($e);
}
//修改前
//return $this->convertExceptionToResponse($e);
}
> 极不建议修改框架核心源代码;
> 指不定又会整出来多少安全隐患,此处只是一个小提示而已!
> 仅做了解即可...
②. 另一种解决方案
- 修改
config.app
文件中的配置项exception_tmpl
,线上和线下可分开配置
//TODO 异常页面的模板文件,主要作为500或程序报错的处理页面
//此为生产模式下(线下)的配置操作,便于代码排错
'exception_tmpl' => Env::get('think_path') . 'tpl/think_exception.tpl',
//此为线上模式下的配置操作,便于隐藏内部错误数据,人性化显示
//'exception_tmpl' => Env::get('think_path') . 'tpl/self_exception.html',
对于上述的配置项,主要是制定好显示页面即可,源框架中是
tpl
文件,此处我直接复制了一个静态页面的源代码而已,具体的动态显示可以自己进行优化补充 …
③. 显示效果
-
如果是在线下的测试环境,app_debug 开启,同时
exception_tmpl
为前者配置项,只要在控制器中随便写一点错误代码,就会出现500
报错,则效果如下:
-
如果是在线上的外网环境,app_debug 关闭,同时
exception_tmpl
为后者配置项,如此一来, 报错页面如下:
★ 附录
♩ 推荐学习
♪ 动态设置模板
- 如果针对不同的客户端情况可以动态设置模板,比如类似如下的代码形式
if (request()->isMobile()) {
config('template.view_path','application\\index\\view\\wap\\');
} else {
config('template.view_path','');
}
♫ 想了想
- 想了想,参考的源代码也没啥必要上传的,所以,自己动手哦 …
- 重申,极不建议修改框架核心源代码
- 其实我很好奇
ThinkPHP5.1 和 Laravel5.5 到底是什么关系?
怎么设计的那么 像!像!像!