如何使用路由CodeIgniter调用子文件夹控制器



我使用的是CodeIgniter框架。我的控制器文件夹中有这样的文件:

 - Controllers
 --- admin.php - Admin Controller
 --- /Admin - Admin Folder
 ----- category.php - Category Controller in Admin folder.

Url:mysite.com/index.php/admin/category表示找不到该页面,因为它正试图调用admin控制器的category函数,但我希望它调用Admin文件夹中category控制器的index函数。

此外,我正在使用admin控制器来创建、编辑admin控制器(如mysite.com/index.php/admin/create)的功能。

我认为,我应该在配置文件中使用$route数组。我应该使用什么路由?

这是CI核心的默认行为。参见system/core/Router.php中的function _validate_request($segments)。此功能尝试确定到控制器的路径。它逐一经历不同的条件,并在满足给定条件后返回结果。除此之外,还涉及两个条件:

  1. 它是一个文件吗?(system/core/Router.php第271行,CI 2.1.2)

    // Does the requested controller exist in the root folder?
    if (file_exists(APPPATH.'controllers/'.$segments[0].'.php'))
    {
        return $segments;
    }
    
  2. 它是文件夹吗?(system/core/Router.php第277行,CI 2.1.2)

    // Is the controller in a sub-folder?
    if (is_dir(APPPATH.'controllers/'.$segments[0]))
    {
        // ...
    

在您的情况下,一旦满足两个条件中的第一个,即找到admin.php文件,函数就会返回。

有两种解决方案:

  1. 重命名文件或文件夹,并分别重构应用程序
  2. 通过扩展核心来更改默认行为。基本上,这将以改变条件检查的顺序结束。这可以通过创建MY_Router类来实现:

    class MY_Router extends CI_Router
    {
        // ...
    }
    

    以及用改变的条件序列重写原始CCD_ 17函数。所以首先检查目录,然后检查函数。

如果不需要太多重构,我会建议第一种解决方案。

在application/config/routes.php文件的底部,添加如下内容:

$route['admin/create'] = 'admin/category';

最新更新