1

我在构造函数中进行验证,检查用户是否已启动会话。

然后我会为各种事情投入一些控制器。

我的问题是 - 我可以让一些控制器不受构造函数(会话验证)的影响,还是我必须把它放到另一个文件中?原因是,我想在构造函数中有两组函数——一组在用户登录时使用,另一组在用户未登录时使用。

我曾经有两个文件并在它们之间切换,但后来我决定将它们合并为一个。

谢谢

4

2 回答 2

3

您需要做的是设置一个基本控制器,它将为您处理会话并通过继承将您登录的控制器与注销的控制器分开。

我给你的建议是看看菲尔鲟鱼关于保持干燥的帖子。在他的帖子中,Phil 解释了如何以这样一种方式实现控制器的基础知识,即父控制器将照顾会话,因此您不必每次都检查它。

举个例子:

MY_控制器:

class MY_Controller extends CI_Controller{
    function __construct(){
        parent::__construct();
        //do things in here that ALL controllers should do.
    }
}

MY_In_Controller:

class MY_In_Controller extends MY_Controller{
    function __construct(){
        parent::__construct();
        //if user doesnt have the session redirect them out NOW!
    }
}

MY_Out_Controller:

class MY_Out_Controller extends MY_Controller{
    function __construct(){
        parent::__construct();
        //if the user has the session, redirect them in NOW.
    }
}

登录控制器:

class Login extends MY_Out_Controller{
    function __construct(){
        parent::__construct();
    }

    function index(){
        //folks that have a session (already logged in) will never even get here.
        //because the parent class MY_Out_Controller already redirected them back in.
    }
}

管理控制器:

class Manage extends MY_In_Controller{
    function __construct(){
        parent::__construct();
    }

    function index(){
        //folks that don't a session (logged out) will never even get here.
        //because the parent class MY_In_Controller already redirected them out.
    }
}

简而言之,不要直接在控制器中编写会话检查。您将过于频繁地编写它并违反DRY 原则

更新:我建议在CodeIgniter 的 Base Classes Revisited中使用 Shane Pearson 的方法来改进 Phil 的方法。

于 2012-09-19T00:13:35.103 回答
0

如前所述,为什么不为特定目的使用单独的不同基本控制器。

我会建议你这样

让我们分两部分,一个说前端控制器不需要会话,另一个控制器说后端控制器需要会话现在,

//application/core/Front_controller.php

class Front_Controller extends MY_Controller
{
 function __construct()
     {
             parent::__construct();

   }
 }

core/backend_controller 下的另一个类

class backend_Controller extends MY_Controller
    {
     function __construct()
     {
             parent::__construct();
             $this->load->library('session');

     }
 }

现在您可以为那些不需要会话的控制器扩展front_controller,并扩展需要来自应用程序/控制器的会话的后端控制器

于 2015-07-22T09:50:02.977 回答