需要 Kohana 3 的帮助并捕获所有变成 404 错误的路线
基于此文档,我实现了一个catch all 路由到错误页面。
这是我的 bootstrap.php
中的最后一条路线
Route::set('default', '<path>', array('path' => '.+'))
->defaults(array(
'controller' => 'errors',
'action' => '404',
));
但是,当我尝试转到不存在的页面时,我不断抛出此异常
Kohana_Exception [ 0 ]:所需路线 未传递参数:路径
如果我将
段设置为可选(即将其括在括号中),那么它似乎只是加载 home
路由,即.. 。
Route::set('home', '')
->defaults(array(
'controller' => 'home',
'action' => 'index',
));
首先定义家乡路线
我像这样执行我的主要请求
$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;
这意味着 404 标头被发送到浏览器,但我假设通过将请求发送到捕获所有路由,那么它应该显示在我的错误控制器中设置的 404 错误。
<?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;
}
}
为什么它不显示我的 404 错误页面?
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 response
$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?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
对于我的项目,我从未为 404 指定任何特定的单独路由。当找不到合适的路由时,我只是捕获路由抛出的异常。
以下是我处理在 Kohana 中发现的各种异常的方法。我希望它能帮助你。
例外404:
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.
Exception404:
啊,我想出了这个。
这一行...
正在设置对
Route::get('default')->uri()
结果的响应。进一步观察,我意识到它将返回一个空字符串,它将与上面的home
路由匹配。我觉得很傻....Ah, I figured this one out.
This line...
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 thehome
route above. I feel silly....