dongyu9667 2011-09-16 08:18
浏览 174
已采纳

如何在Kohana中捕获HTTP_Exception_404错误

I tried to follow the instructions here: http://kohanaframework.org/3.0/guide/kohana/tutorials/error-pages But for some reason I am unable to catch the HTTP_Exception_404 I still get a ugly error page and not my custom page.

Also when I type in the URL error/404/Message, I get a ugly Kohana HTTP 404 error message.

Here is the files structure:

  • modules
    • my
      • init.php
      • classes
        • controller
          • error_handler.php
        • http_response_exception.php
        • kohana.php
      • views
        • error.php

Code:

init.php:

<?php defined('SYSPATH') or die('No direct access');

Route::set('error', 'error/<action>(/<message>)', array('action' => '[0-9]++', 'message' => '.+'))
    ->defaults(array(
            'controller' => 'error_handler'
));

http_response_exception.php:

<?php defined('SYSPATH') or die('No direct access');

class HTTP_Response_Exception extends Kohana_Exception {


    public static function exception_handler(Exception $e)
    {

            if (Kohana::DEVELOPMENT === Kohana::$environment)
            {
                    Kohana_Core::exception_handler($e);
            }
            else
            {
                    Kohana::$log->add(Kohana::ERROR, Kohana::exception_text($e));

                    $attributes = array
                    (
                            'action'  => 500,
                            'message' => rawurlencode($e->getMessage()),
                    );

                    if ($e instanceof HTTP_Response_Exception)
                    {
                            $attributes['action'] = $e->getCode();
                    }

                    // Error sub-request.
                    echo Request::factory(Route::url('error', $attributes))
                            ->execute()
                            ->send_headers()
                            ->response;
            }
    }
}

kohana.php:

<?php defined('SYSPATH') or die('No direct script access.');

class Kohana extends Kohana_Core
{

    /**
     * Redirect to custom exception_handler
     */
    public static function exception_handler(Exception $e)
    {
            Error::exception_handler($e);
    }

} // End of Kohana

error_handler.php:

<?php defined('SYSPATH') or die('No direct access');

class Controller_Error_handler extends Controller {

    public function  before()
    {
            parent::before();

            $this->template = View::factory('template/useradmin');
            $this->template->content = View::factory('error');

            $this->template->page = URL::site(rawurldecode(Request::$instance->uri));

            // Internal request only!
            if (Request::$instance !== Request::$current)
            {
                    if ($message = rawurldecode($this->request->param('message')))
                    {
                            $this->template->message = $message;
                    }
            }
            else
            {
                    $this->request->action = 404;
            }
    }

    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->request->status = 404;
    }

    public function action_503()
    {
            $this->template->title = 'Maintenance Mode';
            $this->request->status = 503;
    }

    public function action_500()
    {
            $this->template->title = 'Internal Server Error';
            $this->request->status = 500;
    }

} // End of Error_handler

I really cannot see where I have done wrong. Thanks in advance for any help.

  • 写回答

5条回答 默认 最新

  • draxq02664 2012-02-04 04:16
    关注

    After a VERY LONG TIME of searching I finally found a solution to my little problem.

    Here is a step by step tutorial on how to load your own custom error pages with Kohana 3.2:

    1. Change the environment variable in the bootstrap.

    Here you have multiple options:

    a. Do what they say in the documentation of the bootstrap.php:

    /**
     * Set the environment status by the domain.
     */
    
    if (strpos($_SERVER['HTTP_HOST'], 'kohanaphp.com') !== FALSE)
    {
        // We are live!
        Kohana::$environment = Kohana::PRODUCTION;
    
        // Turn off notices and strict errors
        error_reporting(E_ALL ^ E_NOTICE ^ E_STRICT);
    }
    

    b. Or just add those two lines without the "if":

    Kohana::$environment = Kohana::PRODUCTION;
    error_reporting(E_ALL ^ E_NOTICE ^ E_STRICT);
    

    c. I have not try this way but in the new bootstrap.php you have this code:

    /**
     * Set Kohana::$environment if a 'KOHANA_ENV' environment variable has been supplied.
     *
     * Note: If you supply an invalid environment name, a PHP warning will be thrown
     * saying "Couldn't find constant Kohana::<INVALID_ENV_NAME>"
     */
    if (isset($_SERVER['KOHANA_ENV']))
    {
        Kohana::$environment = constant('Kohana::'.strtoupper($_SERVER['KOHANA_ENV']));
    }
    

    I assume that you could just give the value "production" to "$_SERVER['KOHANA_ENV']" before those lines.

    Again, like I said I haven't tried it, but it should work.

    I personally just commented out those lines of codes.

    2 Now you need to add a few configurations in a "ini.php" file, or in the "bootstra.php" file.

    <?php defined('SYSPATH') or die('No direct script access.');
    
    /**
     * Turn errors into exceptions. 
     */
    Kohana::$errors = true;
    
    /**
     * Custom exception handler.
     */
    restore_exception_handler();
    set_exception_handler(array('Exception_Handler', 'handler'));
    
    /**
     * Error route.
     */
    Route::set('error', 'error/<action>(/<message>)', array('action' => '[0-9]++', 'message' => '.+'))
    ->defaults(array(
        'controller' => 'exception_handler'
    ));
    

    This is what was missing and made it to hard. For the rest you can easily just follow Kohana3.2 documentation or you can get the module that I added to a repo in GitHub: https://github.com/jnbdz/Kohana-error

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(4条)

报告相同问题?

悬赏问题

  • ¥15 chaquopy python 安卓
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 CSS实现渐隐虚线框
  • ¥15 有没有帮写代码做实验仿真的
  • ¥15 報錯:Person is not mapped,如何解決?
  • ¥30 vmware exsi重置后登不上
  • ¥15 易盾点选的cb参数怎么解啊
  • ¥15 MATLAB运行显示错误,如何解决?
  • ¥15 c++头文件不能识别CDialog
  • ¥15 Excel发现不可读取的内容