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`)。
答案 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
以外的其他内容,尽管这两种方式无关紧要。