CodeIgniter模型/控制器和用户ID

问题描述:

我在CodeIgniter中的模型需要检查用户是否有权执行给定的操作。模型内部我一直在使用$ this-> session-> userdata ['user_id']进行引用。CodeIgniter模型/控制器和用户ID

我的问题是 - 我应该在Controller中设置一个变量到$ this-> session-> userdata ['user_id']并将其传递给Model,或者只是在Model中检查它?

它甚至有问题吗?我想通过$ user_id传入函数会使它(稍微)更具可读性。针对/反对的争论和建议是什么?

您可以在应用程序的基本数据和附带给定模型成员函数的数据之间进行选择。你在任何地方使用的东西都应该得到保证(基础成员,全局变量等),而只在当前函数中使用的东西应该是参数。你会发现在你的模型和视图中的许多地方使用隐含变量(如$this->session->userdata)会很快变成意大利面条,并且如果你没有正确引导它们将会变得不可预测。

在我的CodeIgniter项目中,我添加了一个自定义的基础模型和控制器,它继承自CI框架,添加了他们自己的成员数据,这些数据在应用程序中随处可见。我使用这些基类来提供所有模型和控制器使用的数据和函数(包括像userID这样的东西)。在my_base_controller的构造函数中,我调用CI基础构造函数,并设置我的所有控制器和视图都需要的数据。这保证了类数据的可预测的默认值。

+0

+1我做了一些类似于我的基本控制器,因为userid是在大多数应用程序,你会检查无处不在。 – 2009-11-24 20:01:18

严格来说$this->session->userdata['user_id']属于控制器。
模型处理仅数据...控制器,通过定义控制数据的流...
和认证是数据控制的一种形式...(IMHO)

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()可以b简单如:

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; 
    } 
} 
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; 
    } 
}