【问题标题】:CodeIgniter Model / Controller and UserIDCodeIgniter 模型/控制器和用户 ID
【发布时间】:2010-12-19 10:27:03
【问题描述】:

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

我的问题是 - 我应该在控制器中将变量设置为 $this->session->userdata['user_id'] 并将其传递给模型,还是只是在模型中检查它?

这还重要吗?我想将 $user_id 传递给函数会使它(稍微)更具可读性。支持/反对的论点和建议是什么?

【问题讨论】:

    标签: codeigniter


    【解决方案1】:

    严格来说$this->session->userdata['user_id']属于控制器。
    模型仅处理数据...控制器,根据定义控制数据流...
    身份验证是一种数据控制形式......(恕我直言)

    在代码方面,我遵循这个程序

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • +1 我用我的基本控制器做了类似的事情,因为在大多数应用程序中,用户 ID 是你到处检查的东西。
      猜你喜欢
      • 1970-01-01
      • 2012-04-08
      • 1970-01-01
      • 2011-05-30
      • 2012-05-03
      • 1970-01-01
      • 2015-04-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多