События
Функция событий CodeIgniter предоставляет способ подключиться и изменить внутреннюю работу фреймворка без изменения исходных файлов. При запуске CodeIgniter он следует определенному процессу выполнения. Однако могут быть случаи, когда вы захотите выполнить какое-то действие на определенной стадии процесса выполнения. Например, вы можете захотеть запустить скрипт прямо перед загрузкой контроллеров, сразу после или вызвать один из ваших собственных скриптов в другом месте.
События работают по принципу «публикация/подписка», где событие срабатывает в какой-то момент во время выполнения скрипта. Другие скрипты могут «подписаться» на это событие, зарегистрировавшись в классе событий, чтобы сообщить ему, что они хотят выполнить действие при срабатывании этого события.
Включение событий
События всегда включены и доступны глобально.
Определение события
Большинство событий определяются в файле app/Config/Events.php. Вы можете подписать действие на событие с помощью метода класса Events on(). Первый параметр — имя события, на которое вы подписываетесь. Второй параметр — вызываемый объект, который будет запущен при срабатывании этого события:
use CodeIgniter\Events\Events;
Events::on('pre_system', ['MyClass', 'MyFunction']);
В этом примере, всякий раз, когда выполняется событие pre_controller, создается экземпляр MyClass, и выполняется метод MyFunction. Обратите внимание, что второй параметр может быть любой формой вызываемого объекта, которую распознает PHP:
// Call a standalone function
Events::on('pre_system', 'some_function');
// Call on an instance method
$user = new User();
Events::on('pre_system', [$user, 'some_method']);
// Call on a static method
Events::on('pre_system', 'SomeClass::someMethod');
// Use a Closure
Events::on('pre_system', function (...$params)
{
. . .
});
Установка приоритетов
Поскольку несколько методов могут быть подписаны на одно событие, вам потребуется способ определения порядка вызова этих методов. Вы можете сделать это, передав значение приоритета в качестве третьего параметра метода on(). Меньшие значения выполняются первыми, значение 1 имеет наивысший приоритет, и нет ограничений на меньшие значения:
Events::on('post_controller_constructor', 'some_function', 25);
Все подписчики с одинаковым приоритетом будут выполнены в порядке их определения.
Для вашего использования определены три константы, которые задают некоторые полезные диапазоны значений. Вам не обязательно их использовать, но вы можете найти, что они улучшают читаемость:
define('EVENT_PRIORITY_LOW', 200);
define('EVENT_PRIORITY_NORMAL', 100);
define('EVENT_PRIORITY_HIGH', 10);
После сортировки все подписчики выполняются в порядке. Если какой-либо подписчик возвращает значение boolean false, то выполнение подписчиков прекращается.
Публикация собственных событий
Библиотека событий упрощает создание событий в вашем собственном коде. Для использования этой функции вам просто нужно вызвать метод trigger() в классе Events с именем события:
\CodeIgniter\Events\Events::trigger('some_event');
Вы можете передавать любое количество аргументов подписчикам, добавляя их как дополнительные параметры. Подписчики получат аргументы в том же порядке, в котором они определены:
\CodeIgniter\Events\Events::trigger('some_events', $foo, $bar, $baz);
Events::on('some_event', function ($foo, $bar, $baz) {
...
});
Моделирование событий
Во время тестирования вы можете не захотеть, чтобы события фактически срабатывали, так как отправка сотен писем в день — это как медленное, так и контрпродуктивное решение. Вы можете сказать классу событий моделировать запуск событий с помощью метода simulate(). При значении true все события будут пропущены при вызове метода триггера. Остальное будет работать как обычно.
Events::simulate(true);
Вы можете остановить моделирование, передав false:
Events::simulate(false);
Точки событий
Ниже приведен список доступных точек событий в ядре CodeIgniter:
- pre_system Вызывается очень рано во время выполнения системы. В этот момент загружены только класс бенчмарка и событий. Маршрутизация и другие процессы еще не произошли.
- post_controller_constructor Вызывается сразу после создания вашего контроллера, но до выполнения любых методов.
- post_system Вызывается после отправки окончательной рендерной страницы браузеру в конце выполнения системы после отправки окончательных данных в браузер.
-
email Вызывается после успешной отправки письма из
CodeIgniter\Email\Email. Получает массив свойств классаEmailв качестве параметра. -
DBQuery Вызывается после успешного выполнения запроса к базе данных. Получает объект
Query. -
migrate Вызывается после успешного вызова миграции к
latest()илиregress(). Получает текущие свойстваMigrationRunner, а также имя метода.
© 2014–2020 British Columbia Institute of Technology
Licensed under the MIT License.
https://codeigniter.com/user_guide/extending/events.html