0

可能重复:
不同函数的构造函数会话验证

框架:CI(CodeIgniter)

情况

我有 4 个页面(控制器),即:

home login dashboard editprofile

使用权

  • home可以被所有类型的用户访问,无论是否登录

  • 登录必须仅在未经​​身份验证的情况下才能访问

  • 仪表板和editprofile只能由学生(经过身份验证的用户)访问

我对我的控制器进行了这样的验证:

if($this->session->userdata('isLoggedIn')){
    // stay here do the function
} else {
// leave this page
    header('Location:'.base_url().'login');
}

我的function index(){}.

但是随着我开发系统,随着我创建更多的方法,更多的控制器,它变得更加混乱......因为你需要使用它

if($this->session->userdata('isLoggedIn')){
// stay here do the function
} else {
// leave this page
header('Location:'.base_url().'login');
}

每当你有一个方法,

我已经阅读了stackoverflow中的几个问题......唯一的最佳答案是:link here

它说我必须为此使用装饰器模式......但我不清楚我应该如何做到这一点。

4

1 回答 1

2

为每种类型的用户创建不同的基本控制器,然后您只需设置该语句一次。我们的用户控制器如下所示:

<?PHP
class User_Controller extends MY_Controller
{
function __construct()
{
    parent::__construct();      
    if (!$this->session->userdata('is_logged_in')) {
        $this->session->set_flashdata('message', "I'm sorry, but you must  be logged in to view that page.");
        redirect("/");
    }
}
}

然后我们希望登录用户访问的任何控制器自动扩展 User_Controller 确保任何功能仅在您登录时可用。您需要将其保存到核心文件夹才能扩展它。

您还需要将其添加到您的 config.php 以使基本控制器具有除 MY_ 之外的任何前缀

function __autoload($class)
{
if(strpos($class, 'CI_') !== 0)
{
    @include_once( APPPATH . 'core/'. $class . EXT );
}
}
于 2012-10-13T04:15:05.377 回答