2010-12-16 3 views
5

Wie kann dies durchgeführt werden? Ich versuche das für etwa eine halbe Stunde und es wird ziemlich nervig. Das wäre eine einfache und grundlegende Sache für ein solches Framework. Ich hoffe, dass es einen einfachen Weg gibt, den ich verpasst habe, weil ich anfange zu denken, dass ich diesen Rahmen überhaupt nicht wählen sollte, wenn solche grundlegenden Tings so schwer einzurichten sind.So richten Sie eine benutzerdefinierte 404-Seite für eine Kohana v3-App ein

Dies ist in meiner bootstrap.php-Datei, die den Trick tun sollte.

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

Aber ich bin immer noch

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 

statt meiner benutzerdefinierten 404-Seite. Und ja, wird Kohana::$environment auf Kohana::PRODUCTION;

Es sogar zum echo "ok"; Teil nicht bekommen. Warum wird die Ausnahme nicht gefangen?

+1

nur nicht nach unten zur Wahl gehen, weil ich sagte, ich zu denken, fange an, dass ich t nicht gewählt habe, sein Rahmen, es ist nur, dass dies für so eine einfache Sache sehr seltsam und schwierig zu installieren. Jetzt suche ich nach einer Lösung, damit ich weitermachen kann, jede Idee? – daniels

+1

Ich fürchte, ich habe noch nicht mit v3 gespielt. In v2 ist es ziemlich einfach, das Ereignis-Hook-System zu verwenden. In jedem Fall kann diese Forum-Seite auf Ihren Fall zutreffen, besonders die letzten 2 Beiträge: http://forum.kohanaframework.org/discussion/4777/ko3-404/p1 – Fanis

+0

Ich habe es mit der Methode catch all gemacht. Ich habe ein catch all route eingerichtet und in diesem controler nur den Status auf 404 gesetzt und meine benutzerdefinierte 404-Ansicht gerendert: D Danke. Sie sollten dies eine Antwort machen, damit ich es annehmen kann. – daniels

Antwort

7

Ersetzen Sie die letzte Zeile von bootstrap.php mit:

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

Erstellen neuer Controller "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 

Erstellen Sie zwei Dateien (exception404.php è exception403.php) in "kohana" Ordner:

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

Jetzt können Sie manuell werfen 404 und 403 Fehler (nicht Fehler 500 werfen;)

throw new Kohana_Exception404; 
throw new Kohana_Exception403; 
+6

Wenn Sie wie ich diese Seite lesen und Kohana 3.2 (oder höher) verwenden, müssen Sie 'Kohana_Exception404' wahrscheinlich durch' HTTP_Exception_404' ersetzen. – ereOn

6

Alles, was Sie tun müssen, um den Weg zu einer anderen Ansicht in Ihrem bootstrap.php gesetzt ist hinzuzufügen:

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

, die alle Variablen analysieren werden zur Zeit auf die Fehlerseite analysiert werden, die in lebt:

system/views/kohana/error.php 

dh:

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

Was sind die Nachteile dieser Methode? Warum hat es nur wenige Stimmen? Es sieht kompakt aus (nur ein String + eine View-Datei) und stabil. – Haradzieniec