Spec-Zone.ru › CodeIgniter 4

События

Функция событий 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API