优美的404页面处理

每个应用可以自定义异常和错误处理

  1. app
  2. |__web
  3. www
  4. |--admin
  5. | |--index.php
  6. |__web
  7. |--index.php 入口文件

异常处理在入口文件

  1. <?php
  2. define('APP_NAME', 'web');
  3. define('APP_DEBUG', true);
  4. require '../bootstrap.php';
  5. $engine = new \Timo\Core\Engine();
  6. // 异常处理
  7. try {
  8. $engine->start();
  9. } catch(Exception $e) {
  10. //跳转到404页面,异常处理和日志记录
  11. $engine->run('Error', '_404', ['e' => $e]);
  12. } catch(Error $e) {
  13. $engine->run('Error', '_404', ['e' => $e]);
  14. }

一旦在运行应用的时候发生异常和错误,都指向error控制的_404这个action

  1. app
  2. |--web
  3. |--controller
  4. |--Error.php

Erorr控制器代码如下:

  1. <?php
  2. namespace app\web\controller;
  3. use Timo\Core\Exception;
  4. use Timo\Core\Log;
  5. use Timo\Core\Response;
  6. use Timo\Core\View;
  7. class Error
  8. {
  9. /**
  10. * @param $e Exception
  11. * @return string
  12. * @throws \Timo\Core\Exception
  13. */
  14. public function _404($e = null)
  15. {
  16. if (!$e instanceof \Exception && !$e instanceof \Error) {
  17. goto eco;
  18. }
  19. $log = Exception::buildLog($e);
  20. if (APP_DEBUG) {
  21. $log['trace'] = print_r($log['trace'], true);
  22. $log['traceArray'] = print_r($e->getTrace(), true);
  23. $html = '<pre>';
  24. foreach ($log as $key => $val) {
  25. $html .= $key . ':' . $val . '<br>';
  26. }
  27. return $html . '</pre>';
  28. }
  29. //记录日志
  30. Log::write(print_r($log, true), 'Error', 'Exception.' . date('Y-m.d'));
  31. eco:
  32. //"HTTP/1.1 404 Not Found"
  33. if (!isset($_GET['sendResponseCode'])) {
  34. Response::sendResponseCode(404);
  35. }
  36. $view = View::instance();
  37. $view->assign('title', '404页面 - TimoPHP');
  38. return $view->render();
  39. }
  40. }

404页面返回的状态码必须是404