добавление новой библиотеки в CodeIgniter

#php #codeigniter

#php #codeigniter

Вопрос:

Я только начал изучать CodeIgniter, и я следую этому руководству по аутентификации от nettuts . Я не понял в этом одной вещи:

Он добавил следующий код конструктора в контроллер приветствия, к которому в принципе можно получить доступ, только если у сеанса есть переменное имя пользователя, в противном случае он перенаправит на admin controller.

 function __construct()
    {
        session_start();
        parent::__construct();

        if ( !isset($_SESSION['username'])){
            redirect('admin');      
        }       
    }
  

Он сказал:

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

Означает ли это, что я должен

  1. Создайте файл в приложении / библиотеках (например. auth.php )
  2. Вставьте этот код в 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:

Другой способ сделать это. Это то, что он имеет в виду в руководстве.

  1. Создайте библиотеку с именем 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.
        }
    }
      
  2. Автозагрузите auth класс в autoload.php конфигурационном файле. Нет необходимости в автозагрузке MY_Controller CodeIgniter автоматически распознает ее и запустит. Вы также можете загрузить Auth библиотеку в MY_Controller
  3. Расширяйте свои контроллеры с помощью MY_Controller класса. (Не CI_Controller )

Расширение вашего контроллера даст больше контроля над вашим проектом. Вы можете добавить дополнительные методы для использования везде в вашем проекте.

Для получения дополнительной информации о расширении собственных библиотек CodeIgniter проверьте Создание библиотек: CodeIgniter.

Ответ №3:

Добавьте новую библиотеку в массив библиотек автозагрузки в config/autoload.php .

 $autoload['libraries'] = array ('database', 'session', 'auth');
  

Затем, когда вы хотите вызвать функцию в конструкторах контроллера, используйте $this->auth->function_name(); .
Возможно, вы захотите сделать это подключением, если существует много повторяющихся функций, которые вы не хотите вызывать в каждом отдельном конструкторе.