2010-12-16 17 views
5

¿Cómo se puede hacer esto? Intento hacer esto durante media hora y se está poniendo bastante molesto. Sería esto esto debería ser una cosa básica y fácil de configurar para un marco como este. Espero que tal vez haya una manera fácil de extrañarme, porque estoy empezando a pensar que no debería elegir este marco si esos ajustes básicos son tan difíciles de configurar.Cómo configurar una página 404 personalizada para una aplicación Kohana v3

Esto está en mi archivo bootstrap.php que debería hacer el truco.

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; 
} 

Pero sigo teniendo

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 

en lugar de mi página 404. Y sí, Kohana::$environment se establece en Kohana::PRODUCTION;

Ni siquiera llegar a la parte echo "ok";. ¿Por qué la excepción no queda atrapada?

+1

no vote solo porque he dicho que estoy empezando a pensar que yo no debería elegir t su marco, es solo que encontrar esto muy extraño y difícil de configurar para algo tan fácil. Ahora estoy buscando una solución para poder continuar, ¿alguna idea? – daniels

+1

Me temo que aún no he jugado con v3. En v2, es bastante fácil usar el sistema de anotación de eventos. En cualquier caso, esta página del foro puede aplicarse a su caso, especialmente las últimas 2 publicaciones: http://forum.kohanaframework.org/discussion/4777/ko3-404/p1 – Fanis

+0

Lo hice usando el método catch all. Configuré una ruta de atrapar todas, y en ese control simplemente establecí el estado en 404 y obtuve mi vista 404 personalizada: D Gracias. Deberías hacer de esto una respuesta para poder aceptarlo. – daniels

Respuesta

7

sustituir la última línea de Bootstrap.php con:

/** 
* 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; 

Crear nuevo controlador "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 

Cree dos archivos (exception404.php ¨ exception403.php) en "kohana" carpeta:

<?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 

Ahora se puede tirar manualmente 404 y 403 errores (no se puede tirar de error 500;)

throw new Kohana_Exception404; 
throw new Kohana_Exception403; 
+6

Si, como yo, lees esta página y usas Kohana 3.2 (o posterior), probablemente tendrás que reemplazar 'Kohana_Exception404' con' HTTP_Exception_404'. – ereOn

6

Todo lo que necesita hacer es establecer la ruta de acceso a una vista diferente en su Bootstrap.php añadir:

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

que analizar todas las variables actualmente se está analizando a la página de error que vive en:

system/views/kohana/error.php 

es decir:

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

¿Cuáles son los inconvenientes de este método? ¿Por qué tiene solo unos pocos votos? Se ve compacto (solo una cadena + un archivo de vista) y estable. – Haradzieniec

Cuestiones relacionadas