åPHPé»è®¤çå¼å¸¸å¤çä¸åï¼ThinkPHPæåºçä¸æ¯å纯çé误信æ¯ï¼èæ¯ä¸ä¸ªäººæ§åçé误页é¢ã
[TOC=2,2]
## å¼å¸¸æ¾ç¤º
æ°ççå¼å¸¸é¡µé¢æ¾ç¤ºä¼èªå¨å¤æå½åç请æ±æ¯å¦ä¸ºJson请æ±ï¼å¦ææ¯JSON请æ±åéç¨JSONæ ¼å¼è¾åºå¼å¸¸ä¿¡æ¯ï¼å¦åæç
§HTMLæ ¼å¼è¾åºã
å¨è°è¯æ¨¡å¼ä¸ï¼ç³»ç»é»è®¤å±ç¤ºçå¼å¸¸é¡µé¢ï¼
![](https://box.kancloud.cn/cc2522ef8a6b4c94f2ca1421619e87ca_736x642.png)
>[info]åªæå¨è°è¯æ¨¡å¼ä¸é¢æè½æ¾ç¤ºå
·ä½çé误信æ¯ï¼å¦æå¨é¨ç½²æ¨¡å¼ä¸é¢ï¼ä½ å¯è½çå°çæ¯ä¸ä¸ªç®åçæ示æåï¼ä¾å¦ï¼
![](https://img.kancloud.cn/5c/f8/5cf8baf61164b7a2d2f7e4a56a233273_881x183.png)
ä½ å¯ä»¥éè¿è®¾ç½®`exception_tmpl`é
ç½®åæ°æ¥èªå®ä¹ä½ çå¼å¸¸é¡µé¢æ¨¡æ¿ï¼é»è®¤çå¼å¸¸æ¨¡æ¿ä½äºï¼
~~~
thinkphp/tpl/think_exception.tpl
~~~
ä½ å¯ä»¥å¨åºç¨é
ç½®æ件`app.php`ä¸æ´æ¹å¼å¸¸æ¨¡æ¿
~~~
// èªå®ä¹å¼å¸¸é¡µé¢ç模æ¿æ件
'exception_tmpl' => \think\facade\App::getAppPath() . 'template/exception.tpl',
~~~
é»è®¤çå¼å¸¸é¡µé¢ä¼è¿å`500`ç¶æç ï¼å¦ææ¯ä¸ä¸ª`HttpException`å¼å¸¸åä¼è¿åHTTPçé误ç¶æç ã
## å¼å¸¸å¤çæ¥ç®¡
>[danger] æ¬ç严谨çååï¼æ¡æ¶ä¼å¯¹ä»»ä½é误ï¼å
æ¬è¦åé误ï¼æåºå¼å¸¸ãç³»ç»äº§ççå¼å¸¸åé误é½æ¯ç¨åºçéæ£ï¼è¦å°½æ©æé¤å解å³ï¼èä¸æ¯æ©çã对äºåºç¨èªå·±æåºçå¼å¸¸åååºç¸åºçæè·å¤çã
æ¡æ¶æ¯æå¼å¸¸å¤çç±å¼åè
èªå®ä¹ç±»è¿è¡æ¥ç®¡ï¼éè¦å¨`app`ç®å½ä¸é¢ç`provider.php`æ件ä¸ç»å®å¼å¸¸å¤çç±»ï¼ä¾å¦ï¼
~~~
// ç»å®èªå®ä¹å¼å¸¸å¤çhandleç±»
'think\exception\Handle' => '\\app\\exception\\Http',
~~~
èªå®ä¹ç±»éè¦ç»§æ¿`think\exception\Handle`并ä¸å®ç°`render`æ¹æ³ï¼å¯ä»¥åèå¦ä¸ä»£ç ï¼
~~~
<?php
namespace app\common\exception;
use think\exception\Handle;
use think\exception\HttpException;
use think\exception\ValidateException;
use think\Response;
use Throwable;
class Http extends Handle
{
public function render($request, Throwable $e): Response
{
// åæ°éªè¯é误
if ($e instanceof ValidateException) {
return json($e->getError(), 422);
}
// 请æ±å¼å¸¸
if ($e instanceof HttpException && $request->isAjax()) {
return response($e->getMessage(), $e->getStatusCode());
}
// å
¶ä»é误交ç»ç³»ç»å¤ç
return parent::render($request, $e);
}
}
~~~
èªå®ä¹å¼å¸¸å¤çç主è¦ä½ç¨æ¯æ ¹æ®ä¸åçå¼å¸¸ç±»ååéä¸åçç¶æç åååºè¾åºæ ¼å¼ã
>[danger] äºå®ä¸ï¼é»è®¤å®è£
åºç¨åï¼å·²ç»å¸®ä½ å
ç½®äºä¸ä¸ª`app\ExceptionHandle`å¼å¸¸å¤çç±»ï¼ç´æ¥ä¿®æ¹è¯¥ç±»çç¸å
³æ¹æ³å³å¯å®æåºç¨çèªå®ä¹å¼å¸¸å¤çæºå¶ã
>[info] éè¦æ³¨æçæ¯ï¼å¦æèªå®ä¹å¼å¸¸å¤ç类没æå次è°ç¨ç³»ç»`render`æ¹æ³çè¯ï¼é
ç½®`http_exception_template`å°±ä¸åçæï¼å
·ä½å¯ä»¥åè`Handle`ç±»å
å®ç°çåè½ã
## æå¨æåºåæè·å¼å¸¸
ThinkPHP大é¨åæ
åµå¼å¸¸é½æ¯èªå¨æåºåæè·çï¼ä½ ä¹å¯ä»¥æå¨ä½¿ç¨`throw`æ¥æåºä¸ä¸ªå¼å¸¸ï¼ä¾å¦ï¼
~~~
// 使ç¨thinkèªå¸¦å¼å¸¸ç±»æåºå¼å¸¸
throw new \think\Exception('å¼å¸¸æ¶æ¯', 10006);
~~~
æå¨æè·å¼å¸¸æ¹å¼æ¯ä½¿ç¨`try-catch`ï¼ä¾å¦ï¼
~~~
try {
// è¿éæ¯ä¸»ä½ä»£ç
} catch (ValidateException $e) {
// è¿æ¯è¿è¡éªè¯å¼å¸¸æè·
return json($e->getError());
} catch (\Exception $e) {
// è¿æ¯è¿è¡å¼å¸¸æè·
return json($e->getMessage());
}
~~~
> æ¯æ使ç¨`try-catch-finally`ç»ææè·å¼å¸¸ã
## HTTP å¼å¸¸
å¯ä»¥ä½¿ç¨`\think\exception\HttpException`ç±»æ¥æåºå¼å¸¸
æ¡æ¶æä¾äºä¸ä¸ª`abort`å©æå½æ°å¿«éæåºä¸ä¸ªHTTPå¼å¸¸ï¼
~~~
<?php
namespace app\index\controller;
class Index
{
public function index()
{
// æåº HTTP å¼å¸¸
throw new \think\exception\HttpException(404, 'å¼å¸¸æ¶æ¯');
}
}
~~~
ç³»ç»æä¾äºå©æå½æ°`abort`ç®åHTTPå¼å¸¸çå¤çï¼ä¾å¦ï¼
æ¡æ¶æä¾äºä¸ä¸ª`abort`å©æå½æ°å¿«éæåºä¸ä¸ªHTTPå¼å¸¸ï¼
~~~
<?php
namespace app\index\controller;
class Index
{
public function index()
{
// æåº404å¼å¸¸
abort(404, '页é¢å¼å¸¸');
}
}
~~~
å¦æä½ çåºç¨æ¯APIæ¥å£ï¼é£ä¹è¯·æ³¨æå¨å®¢æ·ç«¯é¦å
å¤æHTTPç¶æç æ¯å¦æ£å¸¸ï¼ç¶ååè¿è¡æ°æ®å¤çï¼å½éå°é误çç¶æç çè¯ï¼åºè¯¥æ ¹æ®ç¶æç èªè¡ç»åºé误æ示ï¼æè
éç¨ä¸é¢çæ¹æ³è¿è¡èªå®ä¹å¼å¸¸å¤çã
**é¨ç½²æ¨¡å¼**ä¸ä¸æ¦æåºäº`HttpException`å¼å¸¸ï¼å¯ä»¥å®ä¹åç¬çå¼å¸¸é¡µé¢æ¨¡æ¿ï¼åªéè¦å¨`app.php`é
ç½®æ件ä¸å¢å ï¼
~~~
'http_exception_template' => [
// å®ä¹404é误ç模æ¿æ件å°å
404 => \think\facade\App::getAppPath() . '404.html',
// è¿å¯ä»¥å®ä¹å
¶å®çHTTP status
401 => \think\facade\App::getAppPath() . '401.html',
]
~~~
模æ¿æ件æ¯æ模æ¿å¼æä¸çæ ç¾ã
> `http_exception_template`é
ç½®ä»
å¨é¨ç½²æ¨¡å¼ä¸é¢çæã
- åºè¨
- åºç¡
- å®è£
- å¼åè§è
- ç®å½ç»æ
- é ç½®
- æ¶æ
- 请æ±æµç¨
- æ¶ææ»è§
- å ¥å£æ件
- å¤åºç¨æ¨¡å¼
- URL访é®
- 容å¨åä¾èµæ³¨å ¥
- æå¡
- é¨é¢
- ä¸é´ä»¶
- äºä»¶
- è·¯ç±
- è·¯ç±å®ä¹
- åéè§å
- è·¯ç±å°å
- è·¯ç±åæ°
- è·¯ç±ä¸é´ä»¶
- è·¯ç±åç»
- èµæºè·¯ç±
- 注解路ç±
- è·¯ç±ç»å®
- ååè·¯ç±
- MISSè·¯ç±
- è·¨å请æ±
- URLçæ
- æ§å¶å¨
- æ§å¶å¨å®ä¹
- åºç¡æ§å¶å¨
- 空æ§å¶å¨
- èµæºæ§å¶å¨
- æ§å¶å¨ä¸é´ä»¶
- 请æ±
- 请æ±å¯¹è±¡
- 请æ±ä¿¡æ¯
- è¾å ¥åé
- 请æ±ç±»å
- HTTP头信æ¯
- 伪éæ
- åæ°ç»å®
- 请æ±ç¼å
- ååº
- ååºè¾åº
- ååºåæ°
- éå®å
- æ件ä¸è½½
- æ°æ®åº
- è¿æ¥æ°æ®åº
- åå¸å¼æ°æ®åº
- æ¥è¯¢æé å¨
- æ¥è¯¢æ°æ®
- æ·»å æ°æ®
- æ´æ°æ°æ®
- å é¤æ°æ®
- æ¥è¯¢è¡¨è¾¾å¼
- é¾å¼æä½
- where
- table
- alias
- field
- strict
- limit
- page
- order
- group
- having
- join
- union
- distinct
- lock
- cache
- comment
- fetchSql
- force
- partition
- failException
- sequence
- replace
- extra
- duplicate
- procedure
- èåæ¥è¯¢
- å页æ¥è¯¢
- æ¶é´æ¥è¯¢
- é«çº§æ¥è¯¢
- è§å¾æ¥è¯¢
- JSONå段
- åæ¥è¯¢
- åçæ¥è¯¢
- æ¥è¯¢äºä»¶
- è·åå¨
- äºå¡æä½
- åå¨è¿ç¨
- æ°æ®é
- æ°æ®åºé©±å¨
- 模å
- å®ä¹
- 模åå段
- æ°å¢
- æ´æ°
- å é¤
- æ¥è¯¢
- æ¥è¯¢èå´
- JSONå段
- è·åå¨
- ä¿®æ¹å¨
- æç´¢å¨
- æ°æ®é
- èªå¨æ¶é´æ³
- åªè¯»å段
- 软å é¤
- ç±»å转æ¢
- 模åè¾åº
- 模åäºä»¶
- 模åå ³è
- ä¸å¯¹ä¸å ³è
- ä¸å¯¹å¤å ³è
- è¿ç¨ä¸å¯¹å¤
- è¿ç¨ä¸å¯¹ä¸
- å¤å¯¹å¤å ³è
- å¤æå ³è
- å ³èé¢è½½å ¥
- å ³èç»è®¡
- å ³èè¾åº
- è§å¾
- 模æ¿åé
- è§å¾è¿æ»¤
- 模æ¿æ¸²æ
- 模æ¿å¼æ
- è§å¾é©±å¨
- é误åæ¥å¿
- å¼å¸¸å¤ç
- æ¥å¿å¤ç
- è°è¯
- è°è¯æ¨¡å¼
- Traceè°è¯
- SQLè°è¯
- åéè°è¯
- è¿ç¨è°è¯
- éªè¯
- éªè¯å¨
- éªè¯è§å
- é误信æ¯
- éªè¯åºæ¯
- è·¯ç±éªè¯
- å ç½®è§å
- 表å令ç
- 注解éªè¯
- æ项
- ç¼å
- Session
- Cookie
- å¤è¯è¨
- ä¸ä¼
- å½ä»¤è¡
- å¯å¨å ç½®æå¡å¨
- æ¥ççæ¬
- èªå¨çæåºç¨ç®å½
- å建类åºæ件
- æ¸ é¤ç¼åæ件
- çææ°æ®è¡¨å段ç¼å
- çæè·¯ç±æ å°ç¼å
- è¾åºè·¯ç±å®ä¹
- èªå®ä¹æ令
- æ©å±åº
- æ°æ®åºè¿ç§»å·¥å ·
- Workerman
- thinkå©æå·¥å ·åº
- éªè¯ç
- Swoole
- éå½
- å©æå½æ°
- å级æ导
- æ´æ°æ¥å¿