我在CodeIgniter中的模型需要检查用户是否有权执行给定的操作。在我使用$ this-> session-> userdata ['user_id']引用的模型中。
我的问题是 - 我应该在Controller中将变量设置为$ this-> session-> userdata ['user_id']并将其传递给模型,还是只在模型中检查它?
甚至重要吗?我想将$ user_id传递给函数会使(略微)更具可读性。有什么争论和建议/反对?
答案 0 :(得分:6)
您可以选择对您的应用程序至关重要的数据和附带给定模型成员函数的数据。你应该保证你到处使用的东西(基本成员,全局等),并且只在当前函数中使用的东西应该是参数。您会发现在模型和视图中的许多地方使用隐含变量(如$this->session->userdata
)会很快成为意大利面条,如果您没有正确引导它们将无法预测。
在我的CodeIgniter项目中,我添加了一个继承自CI框架的自定义基本模型和控制器,添加了自己在应用程序中随处使用的成员数据。我使用这些基类来提供我的所有模型和控制器使用的数据和函数(包括userID
之类的东西)。在my_base_controller
的构造函数中,我调用CI基础构造函数,并设置我的所有控制器和视图所需的数据。这保证了类数据的可预测默认值。
答案 1 :(得分:1)
严格来说$this->session->userdata['user_id']
属于控制者
模型仅处理数据...控制器,根据定义控制数据流...
和身份验证是一种数据控制形式...(恕我直言)
Codewise,我遵循这个程序
class MyControllerName extends Controller{
function MyMyControllerName(){
parent::Controller();
$this->_user_id=$this->session->userdata['user_id']; //<-- define userid as a property of class
}
}
然后,假设我的一个函数foo()
需要身份验证..我会这样做
function foo(){
$this->_checkAuthentication(); //should short out if not authenticated
//rest of the function logic goes here
}
_checkAuthentication()
可以简单化,如:
function _checkAuthentication(){
if(!isset($this->_user_id) && $this->_user_id<=0){ /or any other checks
header("Location: ".base_url()."location_of/user_not_authorised_page");
exit;
}
}