CodeIgniter控制器提供404或它无法加载视图文件

时间:2012-04-14 18:39:52

标签: codeigniter

CodeIgniter安装中的简单控制器存在以下问题。

controllers/pages.php中,Pages.php控制器查看URL段并从/views/pages目录中的文件夹和子文件夹加载静态文件。

示例:

  • 如果我有site.com/buy,那么它会加载buy.php格式/views/pages
  • 如果网址为site.com/buy/go,则会从中加载go.php /views/pages/buy,而site.com/buy现在为index.php /views/pages/buy

已更改为添加另一个子文件夹(例如site.com/buy/go/why中的/views/pages/buy/go/why);

控制器:

class Pages extends CI_Controller {

public function __construct() {
    parent::__construct();
    $this->view(); 
}

private function view() {

    $url_string = $this->uri->uri_string();

    if (!file_exists(APPPATH . 'views/pages/'. $url_string. '/index.php')) {
        if (!file_exists(APPPATH . 'views/pages/' . $url_string . '.php')) {
            show_404();
        } else {
            $path = $url_string . '.php';
        }
    } else {
        $path = $url_string . '/index.php';   
    }

    $this->load->view('pages/' . $path);

}

问题是,无论网址是什么,我都会收到404。

如果我从pages/删除$this->load->view,则会抛出另一个错误:无法加载文件;但它确实使文件正确。 (例如无法加载buy/go.php, while the URL is site.com / buy / go`)。

1 个答案:

答案 0 :(得分:0)

我一直在玩几个不同的东西,看看发生了什么。

我不会详细介绍我尝试的所有内容,但基本上只有几件事要改变。使用__construct()似乎不会以您尝试使用它的方式工作(即只是将所有请求传递给一个方法)。相反,您需要手动指定所有方法或使用路线 - 这就是我所做的。

将以下行添加到config/routes.php会将所有请求重定向到view方法:

$route['pages/(:any)'] = 'pages/view';

一旦你有了这条路线,就不需要__construct了。唯一剩下的就是删除你可能已经完成的路径的pages/部分。我已经测试了下面的代码,远远低于/pages/buy/go/test(3个级别),但理论上它应该在任何嵌套级别都能正常工作。

class Pages extends CI_Controller {

    public function view()
    {
        $url_string = $this->uri->uri_string();

        if (!file_exists(APPPATH . 'views/'. $url_string. '/index.php'))
        {
            if (!file_exists(APPPATH . 'views/' . $url_string . '.php'))
            {
                show_404();
            }
            else
            {
                $path = $url_string . '.php';
            }
        }
        else
        {
            $path = $url_string . '/index.php';   
        }
        $this->load->view($path);
    }
}

作为旁注,加载视图时不需要添加文件扩展名,除非它是.php以外的其他内容,尽管这两种方式无关紧要。