jiangke 发表于 2016-9-21 11:34:07

加载控制器的方法

/**
*加载控制器
* $controller 控制器的路径, 支持数组和string
* $method   方法, 方法和控制器一一对应, 支持array和string
* $name       别名, name值得标准为controller
*/
public function controller($controller, $method = 'index', $name = '')
{
    if ($controller == '')
    {
      return;
    }

    if (is_array($controller) AND is_array($method) AND !empty($method))
    {
      foreach ($controller as $k=> $control)
      {
            $this ->controller($controller, $method[$k]);
      }

      return;
    }

    if (is_array($controller) AND is_string($method))
    {
      foreach ($controller as $control)
      {
            $this ->controller($controller, $method);
      }

      return;
    }
    $x = explode('/', $controller);

    if ($name == '')
    {
      $name = $x;
    }

    if (in_array($name, $this ->_ci_controllers))
    {
      return;
    }

    $CI = &get_instance();

    if (isset($CI->$name))
    {
      show_error('控制器名称已经被占用了');
    }

    if (!is_dir(APPPATH . 'controllers/' . dirname($controller)) OR !file_exists(APPPATH.'controllers/'.strtolower($controller).'.php'))
    {
      show_error('加载的控制器不存在,无法加载');
    }

    if (($subclass = $CI ->config ->item('subclass_prefix')) == '' AND file_exists(APPPATH . 'core/' . $subclass . '_Controller.php'))
    {
      include APPPATH . 'core/' . $subclass . '_Controller.php';
    }

    include APPPATH . 'controllers/' . $controller . '.php';

    if (!class_exists( $control = ucfirst($x)))
    {
      show_error('加载的类不存在');
    }

    $CI->$name = new $control();

    $this->_ci_controllers[] = $name;

    return true;

}

jiangke 发表于 2016-9-21 11:35:23

同时加入个属性$_ci_controllers,

jiangke 发表于 2016-9-21 11:42:13

jiangke 发表于 2016-9-21 11:35
同时加入个属性$_ci_controllers,

一般这个加载控制器方法, 适合加载右侧的菜单, 头部, 底部这种公共部分,同时需要加载的方法中加载模板时设置第三参数为true,$this ->load->view('view', $data, true),默认为false, 同时return出去即可以了。

调用加载方法为:
$this ->load ->controller($controller, $method, $name);
$this ->$name->$method();

注意:   本方法适用于controllers下面有两级目录的项目, 其他的不适用,需要修改的

Hex 发表于 2016-9-22 14:20:39

很赞!感谢楼主分享
页: [1]
查看完整版本: 加载控制器的方法