1

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 に問題がある可能性があります。適切なルートは何ですか?本当の問題は何ですか?

4

1 に答える 1

1

エラーは Controller_Error_Handler にルーティングされますが、コントローラーは Controller_Error と呼ばれます。

これが問題になる場合: Kohana は、classes/error/handler.php に Controller_Error_Handler クラスを想定しています。

于 2012-08-01T02:14:43.327 に答える