arhone/trigger

用于启动事件处理器的库 (PHP 7)

1.0.1 2017-10-30 09:58 UTC

This package is not auto-updated.

Last update: 2024-09-29 04:09:00 UTC


README

触发器 (PHP 7)

触发器允许创建基于其他事件的事件应用。

与路由器不同,触发器不仅创建一对一的连接,还创建一对多的连接。

触发器的工作原理非常简单

  1. 您添加某个事件的处理程序
  2. 触发此事件
  3. 处理程序被执行

可以为同一事件添加任意数量的处理程序,在这种情况下,它们将顺序处理您的请求。

触发器可以在各种任务中发挥作用,例如

  1. 根据不同地址输出网站的不同内容。将页面URI作为事件,特定页面的处理程序返回特定结果。
  2. 处理来自控制台、cron作业或通过其他应用程序的API(例如Telegram)的命令。服务器收到命令,处理程序会对其做出反应。
  3. 创建钩子。例如,可以启动一个事件,表明添加了新的新闻或服务器上上传了新的文件。将来可以编写处理这些事件的代码,例如,在添加新闻时可以清除最新新闻块缓存,在加载图像时可以添加水印。
  4. 记录/注册。例如,如果您正在制作文档管理系统,并且需要发送通知,如果用户已阅读文档。
  5. 限制访问。如果用户未认证,则显示认证表单。
  6. 等等。

安装

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('событие')
触发器理解正则表达式

处理程序接收三个参数

  1. $match - 匹配数组
  2. $data - 在run方法中通过第二个参数传递的数据
  3. $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', 'Привет'); // Привет мой дорогой друг