События позволяют реализовать сложную связь разных расширений. Сделать взаимодействие двух расширений более универсальным и стандартизированным. Используя определённые события из расширения А, расширение Б может выполнять свои задачи, о которых расширению А заранее ничего не было известно, что и обеспечивает меньшую связанность.
{
"require":{
"infrajs/event":"~1"
}
}
Для выполнение тестов откройте в браузере /vendor/infrajs/event/tester.php
Event::handler('onshow', function(){
echo 'onshow';
});
Event::fire('onshow');
Event::handler('print', function(){
echo 'World';
}, ':somekey');
Event::handler('print', function(){
echo 'Hello ';
},'somekey');
Event::fire('print');
Есть нативный объект ```Event``` по этому в javascript нужно использовать ```Events```
Events.handler('print', function(){
console.log('World');
}, ':somekey');
Events.handler('print', function(){
console.log('Hello ');
},'somekey');
Events.fire('print');
Наличие события c Hello не обязательно для того чтобы сработала подписка с World, но если такой handler есть, то World сработает вторым, после обработчика с клчём somekey.
Если все подписки имеют ключи и нет ниодного выполненного ключа, то будет выполнена первая подписка в очереди.
При генерации событий Event все конфиги установленных или необходимых модулей должны быть обработаны. Чтобы были собраны все подписки.
\infrajs\config\Config::get();
Другими словами, использование событий обязывает собирать конфиги всех установленных расширений.
Если генерируется событие для Класса нужно указать критерий отличия передаваемых объектов друг от друга. Объект данных это ассоциативный массив и требуется ключ, который будет определять уникальность всего массива.
Event::$classes["Yml"] = function($pos) {
return $pos["producer"].$pos["article"];
};
$res = Event::fire('Yml.oncheck', $pos);
//$pos, например, массив с данными позиции каталога. Уникальность позиции определяется производителем и артикулом.