dongyi6543 2010-05-19 01:23
浏览 42
已采纳

需要协助Kohana 3并捕获所有路线变成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?

  • 写回答

2条回答 默认 最新

  • douanrang4728 2010-05-19 01:54
    关注

    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);
        }
     }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 无线电能传输系统MATLAB仿真问题
  • ¥50 如何用脚本实现输入法的热键设置
  • ¥20 我想使用一些网络协议或者部分协议也行,主要想实现类似于traceroute的一定步长内的路由拓扑功能
  • ¥30 深度学习,前后端连接
  • ¥15 孟德尔随机化结果不一致
  • ¥15 apm2.8飞控罗盘bad health,加速度计校准失败
  • ¥15 求解O-S方程的特征值问题给出边界层布拉休斯平行流的中性曲线
  • ¥15 谁有desed数据集呀
  • ¥20 手写数字识别运行c仿真时,程序报错错误代码sim211-100
  • ¥15 关于#hadoop#的问题