#php #codeigniter
#php #codeigniter
Вопрос:
Я только начал изучать CodeIgniter, и я следую этому руководству по аутентификации от nettuts . Я не понял в этом одной вещи:
Он добавил следующий код конструктора в контроллер приветствия, к которому в принципе можно получить доступ, только если у сеанса есть переменное имя пользователя, в противном случае он перенаправит на admin controller.
function __construct()
{
session_start();
parent::__construct();
if ( !isset($_SESSION['username'])){
redirect('admin');
}
}
Он сказал:
Если у вас несколько контроллеров, то вместо добавления вышеуказанного кода в каждый контроллер, вам следует создать новую библиотеку, которая расширяет контроллер, в который вы будете вставлять код, и автоматически загрузить библиотеку в project. Таким образом, этот код выполняется всегда при загрузке контроллера.
Означает ли это, что я должен
- Создайте файл в приложении / библиотеках (например. auth.php )
- Вставьте этот код в auth.php
.
if ( !isset($_SESSION['username'])){
redirect('admin');
}
Теперь, как автозагрузить эту библиотеку и заставить ее запускаться каждый раз при загрузке контроллера, как он сказал?
Спасибо
Ответ №1:
1) чтобы автоматически загрузить библиотеку, просто добавьте ее в массив в файле application/config/autoload.php найдите раздел «библиотека» и вставьте туда название библиотеки (без расширения) в качестве элемента массива.
$autoload['libraries'] = array ('auth');
2) Я предлагаю вам использовать собственный обработчик сеанса (session library), который работает довольно хорошо и позволяет избежать использования php $ _SESSION. Вы устанавливаете ширину $this->session->set_userdata(array('username' => 'User1', 'logged' => 'true')
, а затем извлекаете значения с помощью $this->session->userdata['logged']
, например.
Работает как по волшебству и не требует вызова session_start() и так далее. Загляните в справку, потому что там действительно все ясно.
3) Что касается вашей проблемы, я вместо этого перейду к «хукам». Существуют разные перехватчики, в зависимости от их «положения», то есть момента, в который вы их вызываете.
Вы можете использовать, например, ‘post_controller_constructor’, который вызывается после инициализации контроллера, но ПЕРЕД методами, так что он находится на полпути между конструктором и фактическим методом. Обычно я вставляю эти элементы управления сюда.
Вы определяете перехваты в application/config/hooks.php и предоставить им массив:
$hook['post_controller_constructor'] = array(
'class' => 'Auth',
'function' => 'check',
'filename' => 'auth.php',
filepath' => 'hooks',
'params' => array()
);
В любом случае, для всех этих нужд документы довольно ясны и прямолинейны, я предлагаю вам прочитать о перехватах и сеансе, и вы увидите, что все становится намного понятнее!
Ответ №2:
Другой способ сделать это. Это то, что он имеет в виду в руководстве.
-
Создайте библиотеку с именем
MY_Controller
в вашейapplication/libraries
папке и расширяйте ее изCI_Controller
:Class MY_Controller extends CI_Controller { public function __construct() { parent::__construct(); // do the stuff you want to execute on every page. // like auth. } }
- Автозагрузите
auth
класс вautoload.php
конфигурационном файле. Нет необходимости в автозагрузкеMY_Controller
CodeIgniter автоматически распознает ее и запустит. Вы также можете загрузитьAuth
библиотеку вMY_Controller
- Расширяйте свои контроллеры с помощью
MY_Controller
класса. (НеCI_Controller
)
Расширение вашего контроллера даст больше контроля над вашим проектом. Вы можете добавить дополнительные методы для использования везде в вашем проекте.
Для получения дополнительной информации о расширении собственных библиотек CodeIgniter проверьте Создание библиотек: CodeIgniter.
Ответ №3:
Добавьте новую библиотеку в массив библиотек автозагрузки в config/autoload.php .
$autoload['libraries'] = array ('database', 'session', 'auth');
Затем, когда вы хотите вызвать функцию в конструкторах контроллера, используйте $this->auth->function_name();
.
Возможно, вы захотите сделать это подключением, если существует много повторяющихся функций, которые вы не хотите вызывать в каждом отдельном конструкторе.