如何在codeigniter 3中的n子文件夹中设置默认控制器

时间:2016-09-14 11:10:06

标签: php codeigniter-3

-Myproject
  -application
    -controllers
     -subfolder1
        -subfolder2
            -subfolder3
              -subfolder(..n)
                 Controller.php

需要设置routes.php

$route['default_controller'] = 'subfolder1/subfolder2/subfolder3/subfolder(..n)/controller';

2 个答案:

答案 0 :(得分:0)

According to the examples in the docs似乎您不能将Controller放在一个子目录中超过一个级别。

example.com/index.php/subdirectory/controller/function

我也不认为你的路线看起来是正确的。除非home/是控制器或子目录名称,否则在路由开始时不会有"home"。请参阅examples here

$route['default_controller'] = 'subdirectory/controller';

答案 1 :(得分:0)

我已经在codeigniter 3中研究并发现system/core/Router.php库文件的方法_set_default_controller()不能支持子文件夹中的默认控制器。所以我已经覆盖/自定义了这个方法_set_default_controller(),现在它支持n级子文件夹并且对我来说很好。

我使用以下代码创建了application/core/MY_Router.php以覆盖此方法_set_default_controller()

<?php
/**
 * Override Set default controller
 *
 * @author : amit 
 *
 * @return  void
 */
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?
    $x = explode('/', $this->default_controller);
    $dir = APPPATH.'controllers'; // set the controllers directrory path
    $dir_arr = array();
    foreach($x as $key => $val){            
        if(!is_dir($dir.'/'.$val)){
            // find out class i.e. controller
            if(file_exists($dir.'/'.ucfirst($val).'.php')){
                $class = $val; 
                if(array_key_exists(($key+1), $x)){
                    $method = $x[$key+1]; // find out method i.e. action
                }else{
                    $method = 'index'; // default method i.e. action
                }
            }else{
                // show error message if the specified controller not found
                show_error('Not found specified default controller : '. $this->default_controller); 
            }                
            break;               
        }
        $dir_arr[] = $val;
        $dir = $dir.'/'.$val;
    }
    //set directory
    $this->set_directory(implode('/', $dir_arr));

    $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.');
}
?>

现在我们可以在application/config/routes.php中设置默认控制器,如下所示

//没有操作方法名称

$route['default_controller'] = 'subfoler1/subfoler2/subfolder3/subfolder(..n)/controller';

OR

//使用操作方法名称

$route['default_controller'] = 'subfoler1/subfoler2/subfolder3/subfolder(..n)/controller/action'; 

如果我们将传递操作方法名称,它将检测该方法为操作,如果我们不传递操作名称,则它将索引视为操作。