2010-12-05 9 views
1

Wie hier detailliert: Need assistance with Kohana 3 and catch all route turning into a 404 error als die akzeptierte Antwort auf die Frage, ich versuche, Fehler von Kohana geworfen, um hübsche Fehlerseiten anzuzeigen und korrekte HTTP-Codes zu senden.Abfangen Kohana_Request_Exception in Kohana v3 während der Ausführung - unerwartetes Verhalten

Hier ist eine vereinfachte Version des Problems zu demonstrieren:

try { 
    // Instantiate your Request object 
    $request = Request::instance(); 
    // The give it a try, to see if its a valid request 
    $request->execute(); 
} 
catch (Kohana_Request_Exception $e) { 
    header('Content-Type: text/html; charset='.Kohana::$charset, TRUE, 404); 
    echo Request::factory('err/404')->send_headers()->execute()->response; 
    exit; 
} 
echo $request->send_headers()->response; 

Also habe ich zu einem nicht vorhandenen URL navigieren wie http://example.local/moo/ und ich bekomme die folgende Antwort

Kohana_Request_Exception [ 0 ]: Unable to find a route to match the URI: moo 

Hier ist, was happening- ist - Die Anfrage wird versucht, mit einer Kohana_Request_Exception fehlgeschlagen, wird abgefangen ABER, wenn ich versuche, ein neues Anfrageobjekt zu erstellen, THAT Anforderung wirft den Fehler f Von meiner ersten Bitte ....!? wtf ??

Ich habe eine gute Stunde damit herumgespielt und bin so verwirrt wie zu Beginn. Sollte die neue Anfrage von der Fabrik keine Kenntnis von der alten Anfrage haben ?? Warum funktioniert dieser Code nicht, wenn ich ihn im Wesentlichen von der Antwort des d00d kopiert habe?

// Release version and codename 
const VERSION = '3.0.7'; 
const CODENAME = 'hattrick'; 

Jemand zeigen mir in die richtige Richtung .. thx Jungs.

+0

Rufen Sie 'header()' nicht direkt auf. Es wird nur von 'Request :: send_headers().' Sowieso überschrieben. Verwenden Sie stattdessen 'Request-> headers []' und 'Request-> status'. – shadowhand

Antwort

0

Aha! Danke Jungs, aber ich habe es herausgefunden .. Ich hätte den Stack-Trace ein wenig näher betrachtet, die before() Methode der Fehler-Seite Vorlage Controller war ein neuer Fehler werfen, wie es versuchte, Authentifizierung unter Verwendung Request::instance() Ich änderte es auf Request::current() und es ist alles glänzend .

Danke für die Hilfe!

0

Es liegt daran, dass der err/404 Teil in eine URL ist, die versucht wird, auch von Ihren Routen abgeglichen zu werden. Wird es jemals passen, das heißt tun Sie eine Route mit so etwas wie dieses haben ...

Route::set('errors', 'err/<action>', array('action' => '404|500')) {} 

Sie sollten auch ein 404 über das Senden ...

$request->status = 404;