Модели Codeigniter: только возврат не груз? Модели - это просто пространства имен? - PullRequest
0 голосов
/ 14 ноября 2011

Я узнаю о том, что КИ немного опаздывает. Я создавал такие модели:

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

Затем я обошел бы объект $ this-> user, чтобы иметь возможность получить доступ ко всем различным вещам, которые мне нужны из этого объекта, обновить свойства и тому подобное.

Я скачал приложение Phil Sturgeon CI, называемое PyroCMS, и вижу, что он в основном возвращает данных из методов своего объекта, очень похоже на процедурную функцию с прямым циклом.

Итак, модели действительно должны использоваться только в пространствах имен в CI?

Я обнаружил, что используя их такими, какие я есть, с только что обнаруженной проблемой области видимости, я переписываю свои модели.

Конечно, решение - это имя при загрузке, но это означает, что я должен отслеживать и быть осторожным с тем, какое имя использует каждый из них, и это будет проблемой.

Это то, как другие используют модели КИ, в основном возвращая вещи от них вместо того, чтобы использовать их как полнофункциональные объекты?

Ответы [ 2 ]

2 голосов
/ 15 ноября 2011

После 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;
     }
}
2 голосов
/ 14 ноября 2011

Я обнаружил, что Фил Стерджен ответил на этот вопрос: Модели Codeigniter - это просто служебные классы? по сути то, что мне нужно знать.Я все еще могу использовать загруженную модель, используя синтаксис php $object = new Class.Я сделаю это:

class Companies
{
    private $_users;

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

С private и new Я думаю, что наконец-то я в безопасности.Вероятно, я должен пойти дальше и сделать это вне модели, а не в конструкторе, а затем передать это как зависимость.Я отказался от DI.

Я думаю, что отговорил себя от выступа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...