Codeigniter路由,根据会话userdata设置自定义控制器目录

时间:2014-01-04 13:10:52

标签: php codeigniter url-routing

是否有任何方法可以根据会话数据在CI中进行路由。

例如:

CI
 |-controllers
 |       |------student
 |       |         |--dashboard.php
 |       |         |--marks.php
 |       |
 |       |------teacher
 |       |         |--dashboard.php
 |       |         |--marks.php
 |...

这样

if ($this->session->userdata('type') == 'student')

http://localhost/CI/dashboard将在控制器/学生/仪表板上路由

else if($this->session->userdata('type') == 'teacher')

http://localhost/CI/dashboard将在控制器/教师/仪表板上路由

1 个答案:

答案 0 :(得分:0)

如果文件夹结构完全相同(如Q中所述),并且您不需要用户查看他所在的部分(教师 /仪表板,学生 /仪表板),根本不需要任何路由。

使用您提供的逻辑,只需加载不同的视图

例如。制作功能

function _render( $view_file = 'dashboard', $data ) {

    if ($this->session->userdata('type') == 'student') {
        $this->load->view('/student/'. $view_file, $data);
    } else {
        $this->load->view('/teacher/'. $view_file, $data);
    }

}

注意:你的控制器上方的aproach将会很长,因为你必须拥有教师/学生的功能,只需区分视图文件

如果您想确保您的网址类似于/ teacher / dashboard ...和student / dashboard

我会选择这个方法

使用此tutorial扩展CI_Controller。

并在构造函数中确保您重定向到您想要的地方 go 重定向类似

(在 MY_Controller.php 中)

function __construct() {

    parent::__construct();
    if ($this->uri->segment(1) === FALSE) {//segment 'teacher' or 'student' doesnt exists
        if ($this->session->userdata('type') == 'student') {
            redirect('/student/dashboard');
        } else if($this->session->userdata('type') == 'teacher') {
            redirect('/teacher/dashboard');
        } else {
           //default action
        }

    } else {

        if ($this->uri->segment(1) != $this->session->userdata('type')) {
        //something is not right, session do not match the segment
        //logout or redirect to right segment
            redirect($this->session->userdata('type').'/dashboard');
        }
        //else is not needed code continues no redirects are needed
    }

}