2010-05-19 9 views
0

Basé sur this documentation, j'ai mis en place un attraper tous les route qui achemine vers une page d'erreur.Besoin d'aide avec Kohana 3 et attraper tous les itinéraires se transformant en une erreur 404

Voici la dernière route dans mon bootstrap.php

Route::set('default', '<path>', array('path' => '.+')) 
    ->defaults(array(
     'controller' => 'errors', 
     'action'  => '404', 
    )); 

Cependant, je continue à obtenir cette exception jetée quand je tente d'aller à une page non existante

Kohana_Exception [0]: itinéraire requis paramètre non transmis: chemin

Si le segment <path> est facultatif (c'est à dire. envelopper entre parenthèses), il semble juste de charger la route home, qui est ...

Route::set('home', '') 
    ->defaults(array(
     'controller' => 'home', 
     'action'  => 'index', 
    )); 

La route de la maison est d'abord défini.

J'exercerai ma demande principale comme si

$request = Request::instance(); 


try { 

    // Attempt to execute the response 
    $request->execute(); 

} catch (Exception $e) { 


    if (Kohana::$environment === Kohana::DEVELOPMENT) throw $e; 

    // Log the error 
    Kohana::$log->add(Kohana::ERROR, Kohana::exception_text($e)); 

    // Create a 404 response 
    $request->status = 404; 
    $request->response = Request::factory(Route::get('default')->uri())->execute(); 

} 

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

Cela signifie que la 404 en-tête est envoyé au navigateur, mais je suppose en envoyant la demande à la capture toute la route, alors il doit montrer l'ensemble d'erreur 404 dans mon contrôleur d'erreurs.

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

class Controller_Errors extends Controller_Base { 

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

    public function action_404() { 


     $this->bodyClass[] = '404'; 

     $this->internalView = View::factory('internal/not_found'); 

     $longTitle = 'Page Not Found'; 

     $this->titlePrefix = $longTitle; 


    } 
} 

Pourquoi ne montrera-t-il pas ma page d'erreur 404?

Répondre

1

Pour mes projets, je n'ai jamais spécifié de route spécifique séparée pour 404. Je viens d'attraper les exceptions lancées par routage, lorsqu'aucun itinéraire approprié n'a été trouvé.

Voici comment je gère toutes sortes d'exceptions que j'ai découvertes dans Kohana. J'espère que ça t'aidera.

try 
{ 
    try 
    { 
     $request = Request::instance(); 
     $request->execute(); 
    } 
    catch (ReflectionException $e) 
    { 
     Kohana::$log->add(Kohana::ERROR_404, Kohana::exception_text($e)); 

     if (!IN_PRODUCTION) 
     { 
     throw $e; 
     } 

     $request->response = Request::factory('err/404')->execute(); 
    } 
    catch (Exception404 $e) 
    { 
     Kohana::$log->add(Kohana::ERROR_404, Kohana::exception_text($e)); 

     if (!IN_PRODUCTION) 
     { 
     throw $e; 
     } 

     $request->response = Request::factory('err/404')->execute(); 
    } 
    catch (Kohana_Request_Exception $e) 
    { 
     Kohana::$log->add(Kohana::ERROR_404, Kohana::exception_text($e)); 

     if (!IN_PRODUCTION) 
     { 
     throw $e; 
     } 

     header('Content-Type: text/html; charset='.Kohana::$charset, TRUE, 404); 
     echo Request::factory('err/404')->send_headers()->execute()->response; 
     exit; 
    } 
    catch (exception $e) 
    { 
     Kohana::$log->add(Kohana::ERROR, Kohana::exception_text($e)); 

     if (!IN_PRODUCTION) 
     { 
     throw $e; 
     } 

     $request->status = 500; 
     $request->response = Request::factory('err/500')->execute(); 
    } 
} 
catch (exception $e) 
{ 
     if (!IN_PRODUCTION) 
     { 
      throw $e; 
     } 
     echo '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" 
     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 
     <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> 
     <head> 
     <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> 
     </head> 
     <body> 
     here is the message that everything is veeeery bad 
     </body> 
     </html>'; 
     exit; 
} 

Exception404:

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

Avez-vous créé Exception404 ou est-ce défini par Kohana? Merci pour votre réponse aussi :) – alex

+0

c'est le mien. J'ai ajouté son code à la réponse – zerkms

+0

Merci tas! C'est intéressant et utile donc je vais accepter. – alex

0

Ah, je me suis dit celui-ci dehors.

Cette ligne ...

$request->response = Request::factory(Route::get('default')->uri())->execute(); 

été mise en réponse au résultat de Route::get('default')->uri(). En regardant plus loin, j'ai réalisé qu'il retournera une chaîne vide, qui correspondra à la route home ci-dessus. Je me sens bête ....