【问题标题】:Codeigniter models: only return not load? Are models just namespaces?Codeigniter 模型:只返回不加载?模型只是名称空间吗?
【发布时间】:2011-11-13 23:00:36
【问题描述】:

我有点晚才知道 CI 是如何确定范围的。我一直在创建这样的模型:

$this->load->model('user');
$this->user->load ($user_id);

然后我将传递 $this->user 对象,以便能够从该对象访问我需要的所有各种东西、更新属性等。

我下载了一个 Phil Sturgeon CI 应用 callend PyroCMS,我看到他主要从他的对象的方法中返回数据,就像一个直接的程序函数。

那么,模型真的只应该在 CI 的命名空间中使用吗?

我发现以我现在的方式使用它们,以及刚刚发现的范围问题,我正在重写我的模型。

当然解决方案是加载时的名称,但这意味着我必须跟踪并警惕每个人使用的名称,这将是一个问题。

这就是其他人使用 CI 模型的方式,主要是从他们那里返回东西,而不是将它们用作全功能对象吗?

【问题讨论】:

    标签: codeigniter


    【解决方案1】:

    我发现 Phil Sturgeon 回答了这个问题:Codeigniter models are just utility classes? 基本上是我需要知道的。我仍然可以使用 php $object = new Class 语法来使用加载的模型。我会这样做:

    class Companies
    {
        private $_users;
    
        public function __construct ()
        {
            $this->load->model ('users');
            $this->_users = new Users;
        }
    }
    

    有了private 和new,我想我终于安全了。可能我应该继续在模型之外而不是在构造函数中执行此操作,然后将其作为依赖项传递。我已经放弃了 DI。

    我想我已经说服自己离开了壁架。

    【讨论】:

      【解决方案2】:

      在使用 CI 2 年后,我开始使用这些模型的方式如下:

      // Singleton class to lookup Users and perform other
      // tasks not related to one specific user
      class User_model extends MY_Model {
          public static $CI;
          public function __construct()
          {
              parent::__construct();
              self::$CI =& get_instance();
          }
          public function getByEmail($email)
          {
              $data = $this->db->where('email', $email)->get('users')->first_row();
              if ($data)
              {
                  $user = new User;
                  return $user->load($data);
              }
          }
          public function getAllUsers()
          {
              $data = $this->db->get('users')->result();
              foreach ($data as &$row)
              {
                  $user = new User;
                  $row = $user->load($row);
              }
              return $data;
          }
          //... other functions that makes sense in a singleton class
      }
      
      // Actual user object.  Instantiate one for every user you load...
      class User {
          public function __construct($id)
          {
              $data = User_model::$CI->db->where('id', $id)->first_row();
              $this->load($data);
          }
      
           public function load($data)
           {
              foreach ($data as $k => $v)
              {
                  $this->$k = $v;
              }
              return $this;
           }
      }
      

      【讨论】:

      • 感谢您的回复。我认为我要做的方式是当我在这里回答我的问题时概述它:stackoverflow.com/questions/8114374/…。我认为这将使它以对我个人最有意义的方式工作,并且几乎不需要额外的工作。我编写了一个脚本来遍历代码库并查找/替换所有内容以使其正常工作。
      猜你喜欢
      • 2014-12-21
      • 1970-01-01
      • 2011-05-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多