CodeIgniter - 如何检查要在每个方法中使用的会话

时间:2011-11-24 15:51:51

标签: codeigniter session

让我的控制器名为 Book ,我有很多方法,比如     get_book(); read_book(); remove_book();

如果没有用户登录,则无法使用该类中的任何方法,我可以从会话中获取user_id

我的问题是,检查user_id会话是否已设置以便我可以使用这些方法的最佳方式是什么?

至于现在,我正在考虑创建 is_logged_in() 方法,并将其应用于每个带有if-else语句的方法,例如

if($this->is_logged_in()
{
   //do something
}
else
{
   //redirect to home
}  

这不是漫长而乏味吗?有没有最终的方法来实现这一目标?

我阅读了链接

codeigniter check for user session in every controller

但似乎我仍然需要在每种方法中应用is_logged_in检查。

感谢您帮助我!

3 个答案:

答案 0 :(得分:11)

MY_controller.php中创建一个名为/application/core的文件(前缀可在配置文件中编辑):

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class MY_Controller extends CI_Controller {


    function __construct()
    {

        parent::__construct();

        //Initialization code that affects all controllers
    }

}


class Public_Controller extends MY_Controller {

    function __construct()
    {
        parent::__construct();

        //Initialization code that affects Public controllers. Probably not much needed because everyone can access public.
    }

}

class Admin_Controller extends MY_Controller {

    function __construct()
    {
        parent::__construct();
        //Initialization code that affects Admin controllers I.E. redirect and die if not logged in or not an admin
    }

}

class Member_Controller extends MY_Controller {

    function __construct()
    {
        parent::__construct();

        //Initialization code that affects Member controllers. I.E. redirect and die if not logged in
    }

}

然后,只要您创建新控制器,就可以决定它需要什么访问权限

    class Book extends Member_Controller {

        //Code that will be executed, no need to check anywhere if the user is logged in. 
        //The user is guaranteed to be logged in if we are executing code here.

//If you define a __construct() here, remember to call parent::__construct();
    }

这会大大减少代码重复,因为如果你需要Book以外的其他成员控制器,你可以扩展Member_Controller。而不是必须对所有这些进行检查。

答案 1 :(得分:9)

您不一定需要这样做。只需将登录检查代码放在构造函数中即可完成设置!

class Book extends CI_Controller
{
    public function __construct()
    {
        if ($this->is_logged_in())
        {
            // redirect to home
        }
    }

    public function get_book()
    {
        ...
    }

    // The rest of the code...
}

答案 2 :(得分:0)

您可以在控制器的构造函数中使用该方法,如:

if ( ! $this->session->userdata('logged_in'))
    {   
            redirect('login');
    }