2011-09-16 62 views
2

我試圖按照此處的說明操作:http://kohanaframework.org/3.0/guide/kohana/tutorials/error-pages但由於某種原因,我無法捕獲HTTP_Exception_404我仍然收到一個醜陋的錯誤頁面,而不是我的自定義頁面。如何在Kohana中捕獲HTTP_Exception_404錯誤

此外,當我輸入URL錯誤/ 404 /消息,我得到一個醜陋的Kohana HTTP 404錯誤消息。

這裏是文件結構:

  • 模塊
      • 的init.php
        • 控制器
          • error_handler.php
        • http_response_exception.php
        • kohana.php
      • 意見
        • error.php

代碼:

的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 

我真的不明白我做錯了什麼。預先感謝您的幫助。

回答

2

一個很長一段時間後的搜索我終於找到了解決我的小問題。

這裏是如何使用的Kohana 3.2加載自己的自定義錯誤頁一步步教程:

  1. 更改環境變量的自舉。

在這裏,你有多種選擇:

一個。做他們所說的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。或者僅添加那些沒有「if」的兩條線:

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

c。我還沒有嘗試這種方式,但在新的bootstrap.php你有這樣的代碼:

/** 
* 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'])); 
} 

我認爲你可以給值「生產」到「$ _ SERVER [‘KOHANA_ENV’]」這些行前。

再次,就像我說過我沒有嘗試過,但它應該工作。

我個人剛剛註釋掉了這些代碼行。

2現在您需要在「ini.php」文件或「bootstra.php」文件中添加一些配置。

<?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' 
)); 

這是什麼失蹤,並使其很難。其餘的,你可以輕鬆地按照Kohana3.2文檔,或者你可以得到我添加到GitHub中的回購模塊:https://github.com/jnbdz/Kohana-error

+0

嗨,我用你的模塊從GitHub創建自定義錯誤,但我仍然無法使它的工作。你可以幫我嗎? –

+0

在Stackoverflow上發佈您的問題,並將其鏈接到此處我會盡力幫助您。 – jnbdz

+0

謝謝,這裏是[我的問題的鏈接](http://stackoverflow.com/questions/19971897/custom-error-page-cant-get-into-handler) –

0

每個下劃線都是類名稱中的目錄分隔符。所以在命名你的班級Http_Response_Exception時,班級應該在classes/http/response/exception.php。否則,Kohana的自動加載器將無法找到該課程。

編輯

嗯,好像文檔是錯誤的在這方面。 classes/http_response_exception.php沒有意義。

+0

沒有仍然沒有工作。 – jnbdz

+0

嗯,如果您處於開發環境中,您仍然會看到Kohana提供的正常錯誤頁面。是否將'Kohana :: DEVELOPMENT === Kohana :: $ environment'更改爲'Kohana :: DEVELOPMENT!== Kohana :: $ environment'顯示自定義錯誤頁面? – Luwe

+0

Nop它不會改變任何東西。 – jnbdz

2

首先,您需要確保將模塊加載到應用程序/引導程序的模塊部分中,以加載模塊。像這樣

Kohana::modules(array(
'my'=>MODPATH.'my' 
) 
); 

你提到的直接到網址爲你的錯誤處理程序控制器的事實PHP文件觸發一個404錯誤,讓我覺得你的模塊尚未加載。

我還會提出一些更改。

http_response_exception.php不需要擴展Kohana_Exception,因爲這個類不是一個例外,而是一個異常處理程序。沿着同樣的路線,更合適的類名可能是Exception_Handler,因爲類不代表異常,而是處理它們。其次,由於你如何命名這個文件,它應該位於modules/my/classes/http/response/exception.php中。除此之外,這個類的代碼看起來沒問題。

同樣,由於您如何命名您的控制器,它應該被定位和命名有點不同。它移動到模塊/我的/班/控制器/錯誤/ handler.php

記得在一個類名下劃線意味着一個新的目錄,按照http://kohanaframework.org/3.2/guide/kohana/conventions

最後,我不認爲你真的需要在這裏擴展Kohana_Core類,而只需註冊自己的自定義異常處理程序。您可以在任何應用程序的引導文件中註冊自定義異常處理程序,或者與下面的通用代碼的模塊的初始化文件:

set_exception_handler(array('Exception_Handler_Class', 'handle_method')); 

這裏有一個客戶異常處理程序我用,這是非常類似於你:

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

class Exception_Handler { 

public static function handle(Exception $e) 
{ 
    $exception_type = strtolower(get_class($e)); 
    switch ($exception_type) 
    { 
     case 'http_exception_404': 
      $response = new Response; 
      $response->status(404); 
      $body = Request::factory('site/404')->execute()->body(); 
      echo $response->body($body)->send_headers()->body(); 
      return TRUE; 
      break; 
     default: 
      if (Kohana::$environment == Kohana::DEVELOPMENT) 
      { 
       return Kohana_Exception::handler($e); 
      } 
      else 
      { 
       Kohana::$log->add(Log::ERROR, Kohana_Exception::text($e)); 
       $response = new Response; 
       $response->status(500); 
       $body = Request::factory('site/500')->execute()->body(); 
       echo $response->body($body)->send_headers()->body(); 
       return TRUE; 
      } 
      break; 
    } 
} 

} 
+0

我現在得到這個錯誤:ErrorException [Warning]:set_exception_handler()期望參數(Exception_Handler_Class :: handle_method)是一個有效的回調 – jnbdz

2

您正在使用過時的文檔。 HTTP_Exception_404捆綁在3.1中,並且您試圖從3.0實現解決方案。

請參閱documentation for your version of Kohana以獲得有效的解決方案。

+0

讓我看看它。對不起,我一直在忙於其他事情。 – jnbdz

2

所有你需要做的是將路徑設置爲在bootstrap.php中有不同的看法添加:

Kohana_Exception::$error_view = 'error/myErrorPage'; 

,它將分析目前被解析到,生活在錯誤頁面的所有變量:

system/views/kohana/error.php 

即:

<h1>Oops [ <?= $code ?> ]</h1> 
<span class="message"><?= html::chars($message) ?></span> 
+0

它工作得很好,謝謝。但我想在控制器中加載一個動作。所以我有一個更好的控制...所以,如果我得到一個404錯誤,它會加載action_404()... – jnbdz