Материал из Wiki.X-news.org
Перейти к: навигация, поиск

В этой статье вы узнаете, как можно реализовать систему событий на PHP. Вы можете использовать ее в своем веб-приложении или фреймворке.

Что такое система событий? Система событий это способ вызова определенной функции в определенное время в вашей программе. В основном используется для того чтобы добавить дополнительный функционал программе, не переписывая изначальный код. Изменения исходного кода плохи хотя бы тем, что при обновлении программы все изменения будут уничтожены. При использовании системы событий, программисты, использующие вашу систему, смогут дописать свой код, выполняющиеся в определенных местах приложения. Это сделает ваше его более удобным для поддержки, позволит другим программистам легко добавлять свою функциональность в проект.

Обзор

event::$events - статический массив, который хранит все зарегистрированные события и ассоциированные с ними функции.
event::register(‘eventName’, function($args){}) - принимает два аргумента. Первый это название события, второй - объект Closure, который вызывается когда срабатывает событие. Как вы видите, мы четко определяем тип второго аргумента, таким образом нам не надо писать дополнительный код для проверки, является ли метод вызываемым.
public static function register($event, Closure $func)
{
   self::$events[$event][] = $func;
}

event::fire(‘eventName’, $args) - тоже принимает два аргумента. Первый - название события, второй - массив аргументов, которые передаются вызываемой функции. Так как мы можем зарегистрировать много методов на одно событие, необходимо перебрать все события и вызвать их с переданными параметрами.

public static function fire($event, $args = array())
{
   if(isset(self::$events[$event]))
   {
       foreach(self::$events[$event] as $func)
       {
           call_user_func($func, $args);
       }
   }
}

Как использовать Предположим, мы пишем систему блогинга и мы хотим разрешить разработчикам вызывать свои функции в тот момент, когда создается или удаляется топик. В соответствующем месте мы вызываем метод event::method(). В данном случае мы передаем $postInfo, это ассоциативный массив с информацией о топике.

event::fire('blog.post.create', $postInfo);

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

event::register('blog.post.create', function($args = array()){
   mail('myself@me.com', 'Опубликован новый топик', $args['name']);
});

Или, например, если вы делаете фреймворк, можно вызывать обработчики событий в ходе инициализации фреймворка (перед маршрутизацией, до вызова функции контроллера, перед доступом к базе данных и т.д.). В эти моменты вы можете вызвать обработчики событий.

event::fire('pre.controller');
event::register('pre.controller', function($args = array()){
   log::write('pre controller');
   // подключаем нужные файлы
});

Исходный код

class event
{
   public static $events = array();
   public static function fire($event, $args = array())
   {
       if(isset(self::$events[$event]))
       {
           foreach(self::$events[$event] as $func)
           {
               call_user_func($func, $args);
           }
       }
   }
   public static function register($event, Closure $func)
   {
       self::$events[$event][] = $func;
   }
}

категории: FreeBSDкатегории: PHP