CodeIgniter子目录中的默认控制器无法正常工作

Mik*_*ike 9 php codeigniter

路由配置中的default_controller设置为"home.php".

我有一个控制器的子目录,我们称之为"文件夹".所以,如果我访问http://mysite.com/folder/,应该调用默认控制器"folder/home.php"吗?

但由于某种原因,这不起作用,我得到404.访问http://mysite.com/folder/homehttp://mysite.com/folder/home/index按预期工作.除此之外,默认控制器在根目录中工作(http://mysite.com加载home.php).

任何想法,有没有其他人经历过这个?我无法理解它 - 它似乎是一个CI问题,但我找不到其他人有同样的问题.

从我至少理解的方式来看,文档表明这应该可以正常工作:http://codeigniter.com/user_guide/general/controllers.html#subfolders

将默认控制器设置为"folder/home.php"意味着http://mysite.com/folder/正常工作.除了我希望默认控制器只是"home.php" - 无论是在根目录还是在子目录中,都应该加载该目录中的home.php,如文档所示.

干杯

Yas*_*uri 24

对于controllers文件夹中的每个子文件夹,您必须在其中指定默认控制器routes.php.内置$route['default_controller']的子文件夹不起作用.

例如:要为您的folder子文件夹设置默认控制器,home请将以下内容添加到您的/application/config/routes.php文件中:

$route['folder'] = "folder/home";
Run Code Online (Sandbox Code Playgroud)

这意味着与URL http://mysite.com/folder/相同http://mysite.com/folder/home.

  • 我面临着希望我的 default_controller 导航到子文件夹下的控制器的情况。我可以通过在子文件夹之外创建另一个控制器并将其设置为默认控制器来获取它。新控制器只是在“index()”中执行了“redirect('/folder/home')” (2认同)

Gir*_*ish 13

您可以根据需要扩展系统路由器,

  1. application/core/目录中创建My_Router.php

/**要更改此许可证标题,请在"项目属性"中选择"许可证标题".*要更改此模板文件,请选择"工具"| 模板*并在编辑器中打开模板.*/

/**
 * Description of My_Router
 *
 * @author girish
 */
class My_Router extends CI_Router {

    //put your code here
    public function __construct($routing = NULL) {
        parent::__construct($routing);
    }

    protected function _set_default_controller() {
    if (empty($this->default_controller)) {
        show_error('Unable to determine what should be displayed. A default route has not been specified in the routing file.');
    }

    // Is the method being specified?
    if (sscanf($this->default_controller, '%[^/]/%[^/]/%s', $directory, $class, $method) !== 3) {
        $method = 'index';
    }
    if (is_dir(APPPATH . 'controllers' . DIRECTORY_SEPARATOR . $directory) === true) {

        if (!file_exists(APPPATH . 'controllers' . DIRECTORY_SEPARATOR . $directory . DIRECTORY_SEPARATOR . ucfirst($class) . '.php')) {
            // This will trigger 404 later
            return;
        }
        $this->set_directory($directory);
        $this->set_class($class);
        $this->set_method($method);
    } else {
        if (sscanf($this->default_controller, '%[^/]/%s', $class, $method) !== 2) {
            $method = 'index';
        }
        if (!file_exists(APPPATH . 'controllers' . DIRECTORY_SEPARATOR . ucfirst($class) . '.php')) {
            // This will trigger 404 later
            return;
        }
        $this->set_class($class);
        $this->set_method($method);
    }
    // Assign routed segments, index starting from 1
    $this->uri->rsegments = array(
        1 => $class,
        2 => $method
    );

    log_message('debug', 'No URI present. Default controller set.');
   }

}
Run Code Online (Sandbox Code Playgroud)

并且_set_default_controller()从自定义方法覆盖,它将从子目录控制器以及根目录控制器工作.

并在 application/config/routes.php

如果你需要子目录默认控制器,那么

 $route['default_controller'] = "admin/admins/login";
Run Code Online (Sandbox Code Playgroud)
  • admin - 文件夹
  • 管理员 - 控制器
  • 登录 - 方法

如果你需要root目录默认控制器,那么

 $route['default_controller'] = "welcome/index";
Run Code Online (Sandbox Code Playgroud)
  • 欢迎 - 控制器
  • 指数 - 方法

不确定它是否适用于所有版本,但在CI3.0.6中进行了测试

  • 你刚刚为我节省了重新创造这个的压力......竖起大拇指! (2认同)