0

我正在为 codeigniter 使用 HMVC 模块扩展。阅读这篇精彩的文章 - CodeIgniter 的可扩展登录系统 – Ion_Auth。本文建议我们可以创建多个自定义控制器,并根据登录用户的角色,将用户重定向到他各自的控制器。例如,对于 Admin,将他重定向到扩展 Admin_Controller 的控制器等等:

class Admin_Controller extends CI_Controller {

    public function __construct() {

        parent::__construct();

        if( ! $this->ion_auth->is_admin()) {
            redirect('/');
        }
    }
}

因此,我们可以在基本控制器级别本身为该控制器中的所有方法/视图应用通用规则。这就是我要查询的地方:如果我不想对该控制器中的所有视图进行全局控制怎么办。

或者换句话说 - 如果我需要对单个视图进行特定控制,如何去做。例如 - 我有一个名为“Blog”的控制器和名为“view”、“add”、“edit”的方法。现在,视图适用于所有类型的用户,而只有管理员才能添加或编辑博客。这意味着我不能放置控制器级别的逻辑..

class Blog_Controller extends Admin_Controller {
    // should be accessible to both Admin and non-logged in user
    public function view() {..} 

    // Following are only accessible to Admin
    public function edit() {..}
    public function create() {...}
}

我能想到的一种方法是在多个控制器中复制代码并处理特定于用户角色的视图。

4

1 回答 1

1

您可以进行Admin_Blog_Controller 扩展 Blog_Controller,在 User 构造函数中加载用户数据,并在 Admin 构造函数中检查管理员访问权限。

这样你的管理控制器也将包含view来自 Blog_Controller 的方法。

class Admin_Blog_Controller extends Blog_Controller {

    public function __construct() {

        parent::__construct();

        if( ! $this->ion_auth->is_admin()) {
            redirect('/');
        }
    }

    public function add() {
    }

    public function edit() {
    }

    // Optional, if you want to make custom behaviour
    // in the view method of admin:
    public function view() {
        // Calling parent (Blog_Controller) view method.
        parent::view();
        // Doing our own stuff.
        // ...
    }
}


class Blog_Controller extends CI_Controller {

    protected $the_user;

    public function __construct() {

        parent::__construct();

        if($this->ion_auth->in_group('user') || $this->ion_auth->is_admin()) {
            $this->the_user = $this->ion_auth->user()->row();
            $data->the_user = $this->the_user;
            $this->load->vars($data);
        }
        else {
            redirect('/');
        }
    }

    public function view() {
    }
}

再次阅读您的帖子,我意识到这可能不是您所要求的确切解决方案,因为您希望它全部在一个控制器中?我不会删除我的答案,因为有人可能会觉得它仍然有用。

于 2015-05-30T08:20:25.720 回答