Каков наилучший способ получения данных из модели, которая требуется на каждой странице в CodeIgniter? - PullRequest
4 голосов
/ 29 января 2012

Когда пользователь входит в мое приложение CodeIgniter, мне нужен список профилей, которые должны быть в меню на каждой странице, которую они посещают. Вместо вызова функции модели для каждого метода в моем приложении, например, так:

if ($this->users_model->is_logged_in())
{
    $data->profiles = $this->profiles_model->get_profiles();
}

$this->load->vars($data);

Есть ли лучший способ сделать это? Я также рассмотрел вариант расширения класса CI_Controller, но не смог определить, как лучше всего передать переменную фактическому методу, который будет нуждаться в информации.

class MY_Controller extends CI_Controller
{
    public function __construct()
    {
        // Alternatively these could be auto-loaded
        $this->load->model(array('profiles_model', 'users_model'));

        if ($this->users_model->is_logged_in())
        {
            $data->profiles = $this->profiles_model->get_profiles();
        }
    }
}

Мое беспокойство связано с лучшими практиками, лучшей производительностью и лучшими возможностями кеширования (если это вообще возможно).

1 Ответ

1 голос
/ 29 января 2012

Если у меня есть все, что мне нужно на всех страницах, я делаю следующее.

  1. Добавьте помощник .
  2. Добавьте ваш новый помощник к autoload .
  3. Просто вызывайте свою функцию там, где вам нужно.

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

Фактически, в вашем конкретном случае я на самом деле создалмой собственный сеансовый класс для расширения сеанса CI.В качестве очень простого примера (для этого я также использую сеансов в базе данных ):

class MY_Session extends CI_Session {
    public function __construct() {
            parent::__construct();
    }

    public function login($email, $password) {
        $CI =& get_instance();
        $CI->load->model('usermodel', 'user');

        $result = $CI->user->login($email, $password);

        if($result === false) {
            return false;
        } else {
            $this->set_userdata('email', $result->email);

            return true;
        }
    }

    public function is_logged_in() {
        $email = $this->userdata('email');

        if(!empty($email)) {
            return true;
        } else {
            return false;
        }
    }
}

Таким образом, поскольку вы, вероятно, храните эту информацию в сеансах, это имеет большой смыслчтобы сохранить эту информацию вместе.

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