我发现CI的范围有点迟了。我一直在创建这样的模型:
$this->load->model('user');
$this->user->load ($user_id);
然后我会传递$ this->用户对象,以便能够从该对象访问我需要的所有各种内容,更新属性等。
我下载了Phil Sturgeon CI应用程序和PyroCMS,我发现他主要从对象的方法中返回数据,就像一个直接的程序函数。
那么,模型真的只应该用在CI中的命名空间吗?
我发现按照我的方式使用它们,只是刚刚发现的范围问题,我正在覆盖我的模型。
当然解决方案是加载时的名称,但这意味着我必须跟踪并警惕每个人使用的名称,这将是一个问题。
其他人如何使用CI模型,主要是从他们那里返回东西而不是将它们用作全功能对象?
答案 0 :(得分:2)
我发现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。
我想我已经离开了窗台。
答案 1 :(得分:2)
使用CI两年后,我就开始使用这些模型:
// 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;
}
}