404、403、5xx エラー用のカスタム エラー ページを作成しようとしています。ドキュメントに従って、エラーコントローラーを作成し、Kohana_Exception
クラスをオーバーライドして、ルートを追加しました。
Kohana_Exception クラス
class Kohana_Exception extends Kohana_Kohana_Exception {
public static function handler(Exception $e) {
if (Kohana::DEVELOPMENT === Kohana::$environment) {
parent::handler($e);
} else {
try {
Kohana::$log->add(Log::ERROR, parent::text($e));
$attributes = array('action' => 500, 'message' => rawurlencode($e->getMessage()));
if ($e instanceof HTTP_Exception) {
$attributes['action'] = $e->getCode();
}
// Error sub-request.
echo Request::factory(Route::get('error')->uri($attributes))->execute()->send_headers()->body();
}
catch(Exception $e) {
// Clean the output buffer if one exists
ob_get_level() and ob_clean();
// Display the exception text
echo parent::text($e);
// Exit with an error status
exit(1);
}
}
}
}
エラーコントローラー
<?php defined('SYSPATH') OR die('No direct access allowed.');
class Controller_Error extends Webim_Template {
public function before() {
parent::before();
$this->template->page = URL::site(rawurldecode(Request::$initial->uri()));
// Internal request only!
if (Request::$initial !== Request::$current) {
if ($message = rawurldecode($this->request->param('message'))) {
$this->template->message = $message;
}
} else {
$this->request->action(404);
}
$this->response->status((int)$this->request->action());
}
public function action_404() {
$this->template->title = __('404 Not Found');
// Here we check to see if a 404 came from our website. This allows the
// webmaster to find broken links and update them in a shorter amount of time.
if (isset($_SERVER['HTTP_REFERER']) AND strstr($_SERVER['HTTP_REFERER'], $_SERVER['SERVER_NAME']) !== FALSE) {
// Set a local flag so we can display different messages in our template.
$this->template->local = TRUE;
}
// HTTP Status code.
$this->response->status(404);
}
public function action_403() {
$this->request->redirect('welcome');
}
public function action_503() {
$this->template->title = __('Maintenance Mode');
}
public function action_500() {
$this->template->title = __('Internal Server Error');
}
}
ルート
Route::set('error', 'error/<action>(/<message>)',
array('action' => '[0-9]++', 'message' => '.+'))
->defaults(array(
'controller' => 'error_handler'
));
Route::set('default', '(<controller>(/<action>(/<id>)))')
->defaults(array(
'controller' => 'welcome',
'action' => 'index',
));
例外をスローすると、エラーコントローラーに従ってHTTP_Exception_403
リダイレクトされません。welcome
ここでは非常に単純なものが欠けていると思います。
デバッグしたところ、実行ポイントがコントローラーに到達していないことがわかりました。そのため、Route に問題がある可能性があります。適切なルートは何ですか?本当の問題は何ですか?