让我的控制器名为 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
检查。
感谢您帮助我!
答案 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'); }