用户
 找回密码
 入住 CI 中国社区
搜索
查看: 2875|回复: 3
收起左侧

[核心代码 Core] 加载控制器的方法

[复制链接]
发表于 2016-9-21 11:34:07 | 显示全部楼层 |阅读模式
PHP复制代码
/**
 *加载控制器
 * $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[2];
    }
 
    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[2])))
    {
        show_error('加载的类不存在');
    }
 
    $CI->$name = new $control();
 
    $this->_ci_controllers[] = $name;
 
    return true;
 
}
 
复制代码

评分

参与人数 1威望 +5 收起 理由
Hex + 5 赞一个!

查看全部评分

 楼主| 发表于 2016-9-21 11:35:23 | 显示全部楼层
同时加入个属性$_ci_controllers,  
 楼主| 发表于 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下面有两级目录的项目, 其他的不适用,需要修改的
发表于 2016-9-22 14:20:39 | 显示全部楼层
很赞!感谢楼主分享

本版积分规则