Codeigniter 3 show_404函数问题 - MY_Exception未加载

时间:2016-09-23 18:22:47

标签: php codeigniter exception error-handling codeigniter-3

我正在使用Codeigniter 3,我想自定义show_404()函数。

这是我的主控制器:

class Welcome extends CI_Controller {

    public function index() {
        $this->load->view('welcome_message');
    }

    public function otherMethod() {
        show_404();
    }

}

添加到我的routes.php

$route['404_override'] = 'error/show_404_custom';

使用方法show_404_custom

创建控制器Error.php
<?php
defined('BASEPATH') OR exit('No direct script access allowed');

class Error extends CI_Controller {

    public function show_404_custom() {
        $this->load->view('404_read_view');
    }
}

404_read_view.php视图:

<!DOCTYPE html>
<html>
<head>
    <title></title>
</head>
<body>
<p>Custom 404 page.</p>
</body>
</html>

然后我测试了一些未定义的URL,如:

/index.php/welcome/method_A 

我成功获得了自定义404页面。

但是,如果我运行的方法使用show_404()函数,如:

/index.php/welcome/otherMethod 

我奇怪地获得了标准的Codeigniter 404页面。

我搜索了一下,发现我应该扩展Exception核心类并覆盖show_404()函数,如下所示:
https://stackoverflow.com/a/8425433/4301970

所以,我在/ application / core中创建了MY_Exceptions.php类:

<?php (defined('BASEPATH')) OR exit('No direct script access allowed');

class MY_Exceptions extends CI_Exceptions {

    public function __construct() {
        parent::__construct();
    }


    public function show_404() {
        $CI =& get_instance();
        $CI->load->view('404_read_view');
        echo $CI->output->get_output();
        exit;
    }

}

当我运行网址时:

/index.php/welcome/otherMethod 

我收到错误:

Fatal error: Class 'MY_Exceptions' not found in (...)\system\core\Common.php on line 196

我看了一下Common.php,注意到load类函数在libraries目录中而不是核心目录中查找?

function &load_class($class, $directory = 'libraries', $param = NULL)

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:2)

使用它,它在CI 3.1.4(我的最新项目)

中工作
class MY_Exceptions extends CI_Exceptions {

    public function __construct()
    {
        parent::__construct();
    }

    function show_404($page = '', $log_error = TRUE)
    {

        $CI =& get_instance();
        $CI->load->view('404_read_view');
        echo $CI->output->get_output();
        exit;
    }
}

答案 1 :(得分:0)

当您需要使用CI3时,404_override不能在子文件夹中

更改

$route['404_override'] = 'error/show_404_custom'; 
// thinks its in subfolder

位置:应用程序&gt;控制器&gt; Error.php

$route['404_override'] = 'error';

控制器

<?php

defined('BASEPATH') OR exit('No direct script access allowed');

class Error extends CI_Controller {

    public function index() { // change to index
        $this->load->view('404_read_view');
    }
}