Advertisement
  1. Code
  2. CodeIgniter

Как работает система хуков CodeIgniter

Scroll to top
Read Time: 7 min

Russian (Pусский) translation by Ilya Nikov (you can also view the original English article)

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

В этой статье мы начнем с введения в систему hooks фреймворка CodeIgniter. Затем мы обсудим различные типы доступных хуков. И, наконец, мы воспользуемся этой возможностью, чтобы исследовать создание пользовательских хуков.

Хуки: система для переопределения ядра фреймворка

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

Функция «Хуки» CodeIgniter предоставляет средства для использования и изменения внутренней работы фреймворка без изменений файлов ядра.

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

Предположим, что вы хотите создать собственную тестовую систему производительности для мониторинга выполнения приложения. Вы понимаете, что основные файлы должны быть изменены для достижения желаемого результата. В этом случае вы можете использовать хуки pre_system и post_system, чтобы попасть в поток выполнения и собрать статистику по мере необходимости.

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

Итак, это было базовое введение в систему хуков в CodeIgniter. В следующем разделе мы подробно рассмотрим различные доступные вам хуки для подключения к системе.

Пройдемся по разным хукам

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

Например, когда вы реализуете привязку pre_system, вы знаете, что вы находитесь в самом начале фазы начальной загрузки. С другой стороны, если вы выбрали хук post_system, вы можете быть уверены, что выполнение завершено, и ответ уже отправлен клиенту.

В этом разделе мы рассмотрим различные точки хуков, которые предоставляются системой CodeIgniter.

Системные хуки

Хуки pre_system и post_system относятся к этой категории, так как первый вызывается очень рано во время фазы начальной загрузки, а последний вызывается после завершения выполнения страницы.

Я могу придумать несколько вариантов использования, которые могут быть достигнуты с помощью системных хуков:

  • Benchmark
  • Логирование
  • Перенаправление на основе правил
  • И другое

Хуки контроллеров

Есть три хука, которые подпадают под эту категорию, поэтому давайте рассмотрим каждую из них.

Хук перед контроллером

Хук pre_controller вызывается непосредственно перед созданием класса контроллера. Итак, если вы хотите сделать какие-либо дополнительные проверки перед вызовом контроллера, то вам нужен этот хук.

Хук после конструктора контроллера

Как следует из названия, хук post_controller_constructor вызывается сразу после создания объекта контроллера и до фактического вызова метода.

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

Хук пост-контроллера

Хук post_controller вызывается после выполнения метода контроллера. Таким образом, действия, которые вы хотите выполнить после выполнения контроллера, должны быть реализованы с помощью этого хука.

Итак, это была история о хуках контроллера.

Переопределение хуков

Переключатель отображения

Согласно документации CodeIgniter, переключатель display_override переопределяет основной метод _display. Основной метод _display используется для отправки вывода клиенту, и, таким образом, используя крючок display_override, вы можете изменить способ отправки результата пользователю.

Фактически, мы рассмотрим этот хук подробно, когда перейдем к следующему разделу, в котором мы обсудим, как создать пользовательский хук.

Переопределение хука кэша

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

Нам этом завершаем нашу историю о различных хуках в системе CodeIgniter. В следующем разделе мы увидим, как именно вы могли бы воспользоваться преимуществами системы хуков на реальном примере.

Как создать пользовательский хук

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

В нашем случае мы будем использовать хук display_oviewride, который будет отвечать за замену токена. Чтобы быть более точным, мы заменим все вхождения [DATETIME] текущей датой. Конечно, это звучит как довольно простой вариант использования, но вы можете легко расширить его.

По умолчанию система хуков отключена в ядре фреймворка, поэтому первое, что вам нужно сделать, - включить систему хуков.

Идем дальше и открываем файл application/config/config.php.

Найдите следующий фрагмент и включите его, изменив FALSE на TRUE.

1
<?php
2
/*

3
|--------------------------------------------------------------------------

4
| Enable/Disable System Hooks

5
|--------------------------------------------------------------------------

6
|

7
| If you would like to use the 'hooks' feature you must enable it by

8
| setting this variable to TRUE (boolean).  See the user guide for details.

9
|

10
*/
11
$config['enable_hooks'] = FALSE;

Теперь мы готовы определить наши хуки. На самом деле CodeIgniter уже поставляется с файлом application/config/hooks.php, который вы можете использовать, если хотите определить хуки.

По умолчанию файл hooks.php пуст, поэтому давайте добавим наш собственный код hook, чтобы сделать его более значимым.

1
<?php
2
defined('BASEPATH') OR exit('No direct script access allowed');
3
4
$hook['display_override'] = array(
5
        'class'    => 'ReplaceToken',
6
        'function' => 'replacePlaceholderCode',
7
        'filename' => 'ReplaceToken.php',
8
        'filepath' => 'hooks'
9
);

Синтаксис определения пользовательского хука довольно прост. Это массив $hook, который содержит все хуки, которые необходимо выполнить.

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

  • Ключ class содержит имя класса, в котором содержится код, который необходимо выполнить.
  • Ключ function содержит имя метода, который будет вызываться при выполнении хука.
  • Ключ filename указывает на файл, который определяет полный код хука.
  • filepath определяет путь к каталогу файла, объявленного под ключом filename, относительно каталогу application. Как правило, он установлен на hooks, что приводит к структуре application/hooks. Конечно, нет ничего, что помешало бы вам определить совершенно другой путь, если вы этого хотите.

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

В нашем случае мы создадим файл ReplaceToken.php и в соответствии с определением хука его нужно поместить в каталог application/hooks.

Идем дальше и создаем файл application/hooks/ReplaceToken.php со следующим содержимым.

1
<?php
2
class ReplaceToken {
3
  public function replacePlaceholderCode()
4
  {
5
      // load the instance

6
      $this->CI =& get_instance();
7
      
8
      // get the actual output

9
      $contents = $this->CI->output->get_output();
10
      
11
      // replace the tokens

12
      $this->CI->load->helper('date');
13
      $contents = str_replace("[DATETIME]", standard_date(), $contents);
14
      
15
      // set the output

16
      echo $contents;
17
      return;
18
  }
19
}

Целью нашего хука является замена заполнителя [DATETIME] фактической датой перед отправкой клиенту любой страницы нашего приложения.

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

1
// load the instance

2
$this->CI =& get_instance();
3
4
// get the actual output

5
$contents = $this->CI->output->get_output();

Метод get_instance используется для экземпляра экземпляра приложения и присваивается $this->CI. Затем мы используем метод get_output класса Output для извлечения содержимого ответа.

Остальное довольно просто. Заполнитель [DATETIME] должен быть заменен фактической датой. Чтобы упростить задачу, помощник date используется для выполнения желаемой операции, и мы почти полностью выполнили нашу логику hook.

1
// replace the tokens

2
$this->CI->load->helper('date');
3
$contents = str_replace("[DATETIME]", standard_date(), $contents);

Наконец, вам нужно выполнить эхо-вывод, поскольку display_override переопределяет метод _display, который используется для отправки вывода клиенту. Поэтому мы должны сделать это сами в этом случае; в противном случае это было бы обработано основным методом _display.

1
// set the output

2
echo $contents;
3
return;

Фактически, это заканчивает историю нашего собственного хука!

Теперь давайте перейдем к новой странице CodeIgniter, чтобы мы могли протестировать наш пользовательский хук. Создайте файл application/controllers/TokenExample.php со следующим содержимым.

1
<?php
2
defined('BASEPATH') OR exit('No direct script access allowed');
3
4
class TokenExample extends CI_Controller {
5
    public function index()
6
    {
7
        $this->load->view('token_content');
8
    }
9
}

И вот как должно выглядеть соответствующее отображение application/views/token_content.php.

1
Today's date: [DATETIME]

И это все. Откройте в своем браузере http://your-code-igniter-site-url/TokenExample/index, и вы увидите ожидаемый результат!

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

Заключение

Сегодня мы изучили одну из захватывающих встроенных функций CodeIgniter - хуки. Хуки позволяют вам вмешиваться в обычный рабочий процесс выполнения запроса вашего приложения CodeIgniter.

В начале статьи мы обсудили базовую концепцию хуков в CodeIgniter, а затем обсудили различные доступные в системе хуки. Наконец, в последнем разделе мы рассмотрели, как создать пользовательский хук и его внутренние операции.

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

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.