Need assistance with Kohana 3 and catch all route turning into a 404 error
Based on this documentation, I've implemented a catch all route which routes to an error page.
Here is the last route in my bootstrap.php
Route::set('default', '<path>', array('path' => '.+'))
->defaults(array(
'controller' => 'errors',
'action' => '404',
));
However I keep getting this exception thrown when I try and go to a non existent page
Kohana_Exception [ 0 ]: Required route parameter not passed: path
If I make the <path>
segment optional (i.e. wrap it in parenthesis) then it just seems to load the home
route, which is...
Route::set('home', '')
->defaults(array(
'controller' => 'home',
'action' => 'index',
));
The home route is defined first.
I execute my main request like so
$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 res开发者_StackOverflowponse
$request->status = 404;
$request->response = Request::factory(Route::get('default')->uri())->execute();
}
$request->send_headers();
echo $request->response;
This means that the 404 header is sent to the browser, but I assumed by sending the request to the capture all route then it should show the 404 error set up in my errors controller.
<?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;
}
}
Why won't it show my 404 error page?
For my projects I never specified any specific separated route for 404. I just catch exceptions thrown by routing, when no appropriate route was found.
Here is how I am handling all kind of exceptions that I've discovered in Kohana. I hope it will help you.
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);
}
}
Ah, I figured this one out.
This line...
$request->response = Request::factory(Route::get('default')->uri())->execute();
Was setting the response to the result of Route::get('default')->uri()
. Looking at it further, I realised it will return an empty string, which will match the home
route above. I feel silly....
精彩评论