0

我在 CodeIgniter 安装中遇到了一个简单控制器的以下问题。

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

例子:

  • 如果我有site.com/buy,那么它将加载 buy.php 表单/views/pages
  • 如果 URL 是site.com/buy/go,那么它将go.php从 加载/views/pages/buy,而site.com/buy现在index.php将从 /views/pages/buy

已更改为添加另一个子文件夹(例如site.com/buy/go/whyfrom /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);

}

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

pages/如果我从中删除$this->load->view会引发另一个错误:无法加载文件;但它确实得到了正确的文件。(例如,无法加载buy/go.php, while the URL issite.com/buy/go`)。

4

1 回答 1

0

我一直在尝试一些不同的事情,看看发生了什么。

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

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

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

一旦你确定了路线,就不需要__construct. 剩下的唯一事情就是删除pages/路径的一部分,您可能已经这样做了。我已经测试了以下代码/pages/buy/go/test(3 级),但理论上它应该在任何嵌套级别上都一样。

类页面扩展 CI_Controller {

    公共功能视图()
    {
        $url_string = $this->uri->uri_string();

        if (!file_exists(APPPATH . 'views/'. $url_string. '/index.php'))
        {
            if (!file_exists(APPPATH . 'views/' . $url_string . '.php'))
            {
                显示_404();
            }
            别的
            {
                $path = $url_string 。'.php';
            }
        }
        别的
        {
            $path = $url_string 。'/index.php';   
        }
        $this->load->view($path);
    }
}

作为旁注,您不需要在加载视图时添加文件扩展名,除非它不是.php.,尽管这并不重要。

于 2012-04-26T19:12:21.080 回答