2010-12-16 1 views
5

Как это можно сделать? Я пытаюсь сделать это примерно полчаса, и это становится довольно раздражающим. Вы бы это сделали, это было бы простой и простой задачей для создания такой структуры. Я надеюсь, что, возможно, есть простой способ, которым я пропустил, потому что я начинаю с того, что я не должен выбирать эту структуру вообще, если такие базовые настройки так сложно настроить.Как настроить пользовательскую страницу 404 для приложения Kohana v3

Это файл bootstrap.php, который должен делать трюк.

if (! defined('SUPPRESS_REQUEST')) 
{ 
    /** 
    * Execute the main request. A source of the URI can be passed, eg: $_SERVER['PATH_INFO']. 
    * If no source is specified, the URI will be automatically detected. 
    */ 
    $request = Request::instance(); 
    try 
    { 
     // Attempt to execute the response 
     $request->execute(); 
    } 
    catch (Exception $e) 
    { 
     if (Kohana::$environment === Kohana::DEVELOPMENT) 
     { 
      // Just re-throw the exception 
      throw $e; 
     } 
     echo "ok"; 
     // Create a 404 response 
     $request->status = 404; 
     $view = View::factory('error404'); 
     $request->response = $view->render(); 
    } 

    echo $request->send_headers()->response; 
} 

Но я все еще получаю

Fatal error: Uncaught Kohana_Request_Exception [ 0 ]: Unable to find a route to match the URI: test ~ SYSPATH\classes\kohana\request.php [ 674 ] thrown in C:\Xampp\htdocs\system\classes\kohana\request.php on line 674 

вместо моей страницы пользовательских 404. И да, Kohana::$environment установлен в Kohana::PRODUCTION;

Он даже не добраться до echo "ok"; части. Почему исключение не попало?

+1

не вниз голосования только потому, что я сказал, я начинаю не думать, что я должен не выбрал т его рамки, это просто, что найти это очень странно и трудно настроить для такой легкой вещи. Теперь я ищу решение, чтобы я мог продолжать, любой идее? – daniels 2010-12-16 18:20:20

+1

Боюсь, я еще не играл с v3. В v2 довольно легко использовать систему захвата событий. В любом случае эта страница форума может применяться к вашему делу, особенно последние 2 сообщения: http://forum.kohanaframework.org/discussion/4777/ko3-404/p1 – Fanis 2010-12-16 18:27:14

+0

Я сделал это, используя метод catch. Я установил уловка всего маршрута, и в этом контролере просто установил статус на 404 и отобразил мой пользовательский вид 404: D Спасибо. Вы должны ответить на этот вопрос, чтобы я мог его принять. – daniels 2010-12-16 19:21:56

ответ

7

Заменить последнюю строку bootstrap.php с:

/** 
* Set the production status 
*/ 
define('IN_PRODUCTION', FALSE); 

/** 
* Execute the main request. A source of the URI can be passed, eg: $_SERVER['PATH_INFO']. 
* If no source is specified, the URI will be automatically detected. 
*/ 
$request = Request::instance(); 

try 
{ 
    $request->execute(); 
} 
catch (Kohana_Exception404 $e) 
{ 
    $request = Request::factory('error/404')->execute(); 
} 
catch (Kohana_Exception403 $e) 
{ 
    $request = Request::factory('error/403')->execute(); 
} 
catch (ReflectionException $e) 
{ 
    $request = Request::factory('error/404')->execute(); 
} 
catch (Kohana_Request_Exception $e) 
{ 
    $request = Request::factory('error/404')->execute(); 
} 
catch (Exception $e) 
{ 
    if (! IN_PRODUCTION) 
    { 
     throw $e; 
    } 

    $request = Request::factory('error/500')->execute(); 
} 

echo $request->send_headers()->response; 

Создать новый контроллер "error.php":

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

class Controller_Error extends Controller { 

    public function action_404() 
    { 
     $this->request->status = 404; 
     $this->request->headers['HTTP/1.1'] = '404'; 
     $this->request->response = 'error 404'; 
    } 

    public function action_403() 
    { 
     $this->request->status = 403; 
     $this->request->headers['HTTP/1.1'] = '403'; 
     $this->request->response = 'error 403'; 
    } 

    public function action_500() 
    { 
     $this->request->status = 500; 
     $this->request->headers['HTTP/1.1'] = '500'; 
     $this->request->response = 'error 500'; 
    } 
} // End Error 

Создать два файла (exception404.php и исключение403.php) в "kohana" Папка:

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

class Kohana_Exception403 extends Kohana_Exception { 

    public function __construct($message = 'error 403', array $variables = NULL, $code = 0) 
    { 
     parent::__construct($message, $variables, $code); 
    } 

} // End Kohana_Exception 403 


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

class Kohana_Exception404 extends Kohana_Exception { 

    public function __construct($message = 'error 404', array $variables = NULL, $code = 0) 
    { 
     parent::__construct($message, $variables, $code); 
    } 

} // End Kohana_Exception 404 

Теперь вы можете вручную выбросить 404 и 403 ошибки (вы не можете бросить ошибка 500;)

throw new Kohana_Exception404; 
throw new Kohana_Exception403; 
6

Все, что вам нужно сделать, это указать путь к иной точки зрения в вашем bootstrap.php добавить:

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

, который будет анализировать все переменные в настоящее время разобранные на страницу ошибки, которая живет в:

system/views/kohana/error.php 

т.е.

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