Ion Auth проверяет логин из класса MY_Loader

Это может быть базовый вопрос Codeigniter (или php), но я пытаюсь проверить, вошел ли пользователь в систему с помощью Ion Auth для каждого вызова страницы, поэтому я могу предоставить ссылку «Вход» или «Выход».

У меня есть представления заголовка, содержимого и нижнего колонтитула, загружаемые из класса MY_Loader, и я пытался использовать $this->ion_auth->logged_in(), чтобы проверить, вошел ли пользователь в систему, но я получаю эту ошибку php,

Ошибка PHP: Неопределенное свойство: MY_Loader::$ion_auth

Вот MY_Loader.php:

<?php

/**
 * /application/core/MY_Loader.php
 *
 */
class MY_Loader extends CI_Loader {
    public function template_main($template_name, $vars = array(), $return = FALSE)
    {
        $vars['signin'] = $this->ion_auth->logged_in() ? 'signout' : 'signin';
        $vars['signin_text'] = $this->ion_auth->logged_in() ? 'Sign-out' : 'Sign-in';
        $content  = $this->view('frontend/main_template/header', $vars, $return);
        $content .= $this->view($template_name, $vars, $return);
        $content .= $this->view('frontend/main_template/footer', $vars, $return);

        if ($return)
        {
            return $content;
        }
    }
}

/* End of MY_Loader.php */
/* Location: ./application/core/MY_Loader.php */

Я автоматически загружаю библиотеку ion_auth. Как я могу вызвать функцию logged-in() в классе MY_Loader?


person mjpsr11    schedule 04.03.2014    source источник


Ответы (2)


Автозагружаемые файлы, вероятно, еще не загружены. Добавьте $this->load->library('ion_auth') в начало метода.

person Ben Edmunds    schedule 04.03.2014
comment
Я думал об этом. Затем он выдает мне другую ошибку: Undefined property: MY_Loader::$load - person mjpsr11; 05.03.2014
comment
Ладно, думаю, я понял это. Вместо использования $this я создал новую объектную переменную $ia = new ion_auth();, а затем использовал $ia->ion_auth->logged_in(). Это сработало, как и ожидалось. Возможно, кто-то может объяснить, зачем это нужно для Codeignitor. - person mjpsr11; 05.03.2014
comment
Вместо этого попробуйте следующее: $ci =& get_instance(); $ci-›ion_auth-›logged_in(); - person Ben Edmunds; 05.03.2014
comment
Да, это тоже работает. Думаю, лучше получить экземпляр существующего объекта, чем создавать новый. Спасибо, Бен. - person mjpsr11; 05.03.2014

РЕДАКТИРОВАТЬ: я неправильно понял вопрос, извините. Но я оставляю ответ для будущих читателей, которые могут найти его полезным. Попробуйте использовать крючок, чтобы решить вашу проблему.

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

$this->user_logged_in = (bool)$this->ion_auth->logged_in();

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

$data['user_logged_in'] = $this->user_logged_in;
$this->load->view('view_file_name', $data);

Что мне нравится делать, когда я хочу, чтобы все приложение требовало входа в систему, так это вызывать эти типы проверок через код CodeIgniter хуки. В этом случае, возможно, хук post_controller_constructor, так он вызывается автоматически (только убедитесь, что отфильтрованы страницы, которые вы хотите игнорировать, эта проверка, т. е. вход и регистрация и т. д.).

person Petar Zivkovic    schedule 04.03.2014