arhone / trigger
用于启动事件处理器的库 (PHP 7)
1.0.1
2017-10-30 09:58 UTC
Requires
- php: ^7.0
This package is not auto-updated.
Last update: 2024-09-29 04:09:00 UTC
README
触发器 (PHP 7)
触发器允许创建基于其他事件的事件应用。
与路由器不同,触发器不仅创建一对一的连接,还创建一对多的连接。
触发器的工作原理非常简单
- 您添加某个事件的处理程序
- 触发此事件
- 处理程序被执行
可以为同一事件添加任意数量的处理程序,在这种情况下,它们将顺序处理您的请求。
触发器可以在各种任务中发挥作用,例如
- 根据不同地址输出网站的不同内容。将页面URI作为事件,特定页面的处理程序返回特定结果。
- 处理来自控制台、cron作业或通过其他应用程序的API(例如Telegram)的命令。服务器收到命令,处理程序会对其做出反应。
- 创建钩子。例如,可以启动一个事件,表明添加了新的新闻或服务器上上传了新的文件。将来可以编写处理这些事件的代码,例如,在添加新闻时可以清除最新新闻块缓存,在加载图像时可以添加水印。
- 记录/注册。例如,如果您正在制作文档管理系统,并且需要发送通知,如果用户已阅读文档。
- 限制访问。如果用户未认证,则显示认证表单。
- 等等。
安装
composer require arhone/commutation
<?php use arhone\commutation\trigger\Trigger; include 'vendor/autoload.php'; $trigger = new Trigger();
示例
<?php // Добавляем обработчик на определённое событие $trigger->add('событие', function () { return 'ответ'; }); // Запускаем событие echo $trigger->run('событие'); // ответ // триггером для запуска обработчика послужил запуск события $trigger->run('событие')
触发器理解正则表达式
处理程序接收三个参数
- $match - 匹配数组
- $data - 在run方法中通过第二个参数传递的数据
- $option - 设置数组
<?php // Добавляем обработчик $trigger->add('switch:(on|off)', function ($match, $data, $option) { if ($match[1] == 'on') { return $data . ' - Включен'; } else { return $data . ' - Отключен'; } }); // Запускаем событие echo $trigger->run('switch:on', 'Чайник'); // Чайник - Включен
注册多个处理程序
前一个处理程序的响应将作为下一个处理程序的$data传递
<?php // Добавляем обработчик $trigger->add('switch:(on|off)', function ($match, $data) { return 'Самовар'; }); // Добавляем обработчик $trigger->add('switch:(on|off)', function ($match, $data) { if ($match[1] == 'on') { return $data . ' - Включен'; } else { return $data . ' - Отключен'; } }); // Запускаем событие echo $trigger->run('switch:on', 'Чайник'); // Самовар - Включен
处理程序可以设置为“中断”
在“中断”处理程序上,如果处理程序返回非null,则将中断当前事件的处理堆栈。
要创建中断处理程序,需要将(break)参数设置为true
<?php // Добавляем обрывающий обработчик $trigger->add('switch:(on|off)', function ($match, $data) { $energy = false; if (!$energy) { return 'Нет электричества'; } }, [ 'break' => true ]); // Добавляем обработчик $trigger->add('switch:(on|off)', function ($match, $data) { if ($match[1] == 'on') { return $data . ' - Включен'; } else { return $data . ' - Отключен'; } }); // Запускаем событие echo $trigger->run('switch:on', 'Чайник'); // Нет электричества
队列位置
使用$option数组可以指定处理程序的启动顺序。
建议值从-1到1(默认为0)
因此,使用-1可以将处理程序的执行放置在开始处,而使用1可以将它放置在末尾。
使用$trigger->plan()方法而不是$trigger->run()方法,可以查看处理程序的执行顺序。
<?php $trigger->add('hello', function ($match, $data) { return $data . ' дорогой'; }, [ 'name' => 'Второй обработчик', 'position' => 0.2 ]); $trigger->add('hello', function ($match, $data) { return $data . ' мой'; }, [ 'name' => 'Первый обработчик', 'position' => 0.1 ]); $trigger->add('hello', function ($match, $data) { return $data . ' друг'; }, [ 'name' => 'Третий обработчик', 'position' => 0.3 ]); echo $trigger->run('hello', 'Привет'); // Привет мой дорогой друг print_r($trigger->plan('hello'));
命名处理程序
可以为处理程序设置一个唯一名称。
如上例所示,名称有助于在“plan”方法中使用时识别处理程序。
还可以通过名称覆盖其他处理程序选项。
<?php $trigger->add('test', function ($match, $data) use ($trigger) { $trigger->option('two', [ 'status' => false // Второй обработчик не будет запущен ]); return 'Первый'; }, [ 'name' => 'one', ]); $trigger->add('test', function ($match, $data) { return 'Второй'; }, [ 'name' => 'two', ]); echo $trigger->run('test'); // Первый
启用/禁用处理程序
“status”选项允许禁用不需要的处理程序。
<?php $trigger->add('start', function ($match, $data) { return $data . ' раз'; }); $trigger->add('start', function ($match, $data) { return $data . ' два'; }); $trigger->add('start', function ($match, $data) { return $data . ' три'; }, [ 'status' => false ]); echo $trigger->run('start'); // раз два
更多示例
路由器管理
可以用于处理路由。
您可以自己构建请求模板,例如,对于通过Web服务器进行的请求,可以指定HTTP:TYPE:path,而对于通过控制台的请求,可以指定console:command。
<?php $trigger->add('(http[s]?):get:/home.html', function () { return 'hello word'; }); // Пользователь зашёл по HTTP типа GET на страницу /home.html echo $trigger->run('http:get:/home.html');
<?php $trigger->add('console:cache-clear', function () { return 'Кэш очищен'; }); echo $trigger->run('console:cache-clear');
中间件实施
<?php // Проверяем если пользователь не авторизован $trigger->add('http:get:/home.html', function () { if (User::id() == false) { return 'Нужно авторизироваться'; } }, [ 'break' => true ]); // Или выводим приветствие $trigger->add('http:get:/home.html', function () { return 'Привет'; }); // Пользователь зашёл по HTTP типа GET на страницу /home.html echo $trigger->run('http:get:/home.html');
响应事件(观察者)
<?php // Очищаем кэш новостей $trigger->add('module:news:add', function () { Cache::clear('module:news'); }); // Событие что была добавлена новость с id 100 $trigger->run('module:news:add', [ 'id' => 100 ]);
处理请求。
<?php // Пишем кэш в Redis $trigger->add('cache:set', function ($match, $data) { CacheRedis::set($data['key'], $data['value']); }); // Пишем в файл на всякий случай $trigger->add('cache:set', function ($match, $data) { CacheFile::set($data['key'], $data['value']); }); // Генерируем команду на запись в кэш $trigger->run('cache:set', [ 'key' => 'ключ', 'value' => 'данные для кэширования' ]);
<?php // Берём кэш из редиса, если сервер редиса доступен $trigger->add('cache:get', function ($match, $data) { if (CacheRedis::status() == true) { return CacheRedis::get($data['key']); } }, [ 'break' => true ]); // Параметр break, остановит стек, если обработчик что-то вернул (не null) // Если редис ничего не вернул, то запустится следующий обработчик и вернёт кэш из файла $trigger->add('cache:get', function ($match, $data) { if (CacheFile::status() == true) { return CacheFile::get($data['key']); } }); // Генерируем команду на получение кэша $trigger->run('cache:get', [ 'key' => 'ключ' ]);
通过处理程序堆栈处理数据。
<?php $trigger->add('hello', function ($match, $data) { return $data . ' мой'; }); $trigger->add('hello', function ($match, $data) { return $data . ' дорогой'; }); $trigger->add('hello', function ($match, $data) { return $data . ' друг'; }); echo $trigger->run('hello', 'Привет'); // Привет мой дорогой друг