优美的404页面处理
每个应用可以自定义异常和错误处理
app
|__web
www
|--admin
| |--index.php
|__web
|--index.php 入口文件
异常处理在入口文件
<?php
define('APP_NAME', 'web');
define('APP_DEBUG', true);
require '../bootstrap.php';
$engine = new \Timo\Core\Engine();
// 异常处理
try {
$engine->start();
} catch(Exception $e) {
//跳转到404页面,异常处理和日志记录
$engine->run('Error', '_404', ['e' => $e]);
} catch(Error $e) {
$engine->run('Error', '_404', ['e' => $e]);
}
一旦在运行应用的时候发生异常和错误,都指向error控制的_404这个action
app
|--web
|--controller
|--Error.php
Erorr控制器代码如下:
<?php
namespace app\web\controller;
use Timo\Core\Exception;
use Timo\Core\Log;
use Timo\Core\Response;
use Timo\Core\View;
class Error
{
/**
* @param $e Exception
* @return string
* @throws \Timo\Core\Exception
*/
public function _404($e = null)
{
if (!$e instanceof \Exception && !$e instanceof \Error) {
goto eco;
}
$log = Exception::buildLog($e);
if (APP_DEBUG) {
$log['trace'] = print_r($log['trace'], true);
$log['traceArray'] = print_r($e->getTrace(), true);
$html = '<pre>';
foreach ($log as $key => $val) {
$html .= $key . ':' . $val . '<br>';
}
return $html . '</pre>';
}
//记录日志
Log::write(print_r($log, true), 'Error', 'Exception.' . date('Y-m.d'));
eco:
//"HTTP/1.1 404 Not Found"
if (!isset($_GET['sendResponseCode'])) {
Response::sendResponseCode(404);
}
$view = View::instance();
$view->assign('title', '404页面 - TimoPHP');
return $view->render();
}
}
404页面返回的状态码必须是404