pllano / hooks
API 商店钩子
1.0.2
2018-02-06 00:48 UTC
Requires
- php: >=5.4.0
- psr/http-message: 1.0.1
Requires (Dev)
- psr/http-message: 1.0.1
This package is not auto-updated.
Last update: 2024-09-21 15:34:58 UTC
README
Pllano\Hooks\Hook 管理器 - 在脚本开始和结束时或在脚本中的任何需要的位置执行等待的类,传递给它们用于处理的信息,它们可以替换或从中获取数据而不替换。这允许在不干涉您的 App 代码的情况下编写扩展。具体的钩子不应该知道何时执行,这应该由 Pllano\Hooks\Hook 管理器确定,它通过获取钩子参数并与当前条件进行比较。如果匹配,则启动钩子。钩子的任务是完成其任务。
如何以及在哪里使用?示例
- 您想连接并跟踪网站的访问量。您将插件添加到执行列表中,并仅从请求中获取数据,将其返回而不做更改。
- 您需要控制所有通过 POST 发送过来的参数以提高安全性。您创建一个钩子并将其仅针对 POST 请求进行定位。处理来自数组 $post = $request->getParsedBody(); 的参数,并返回经过验证和清理的数据。
- 您想建立黑白名单来提高对可能的 DDoS 攻击的防护。为此,首先需要配置最大缓存,并添加一个插件来过滤那些对网站进行大量访问的 IP。还需要一个插件来查找您网站上的所有重请求,并通知您以将它们添加到缓存或优化脚本。
Hooks - 拦截并可以更改
- 在
GET和POST请求中拦截Request - 在
GET和POST请求中拦截Response - 在
GET请求中拦截View- 模板化引擎的数组 - 在
GET请求中拦截Render- 用于渲染的模板名称 - 在
POST请求中拦截Callback
设置要执行的 Hook 列表
可以通过两种方式通过参数传递 Hook 列表
- 通过构造函数传递数组
$param = []; - 从文件
hooks.json
Hook 配置参数
print- 输出调试信息1或关闭0vendor- 完整的类名query- 当触发GETPOST或all时使用的查询。不能使用零。render- 用于渲染的模板index.twig或all或0url- 具体的 URL,使用/或all或0(计划改进*示例/article-*.html)routers- 路由名称index、article或0或allresource- 正在访问的表或资源user或all或0app- App 类型 -site、admin- 因为render的名称可能相同或all,不能使用零。state- 状态0- 未激活或1- 激活config- 个别配置{数组}或0
{
"hooks": {
"print": 1,
"vendor": {
"demo-hook-index-get": {
"vendor": "\\Pllano\\Hooks\\HookIndexGet",
"query": "GET",
"render": 0,
"routers": 0,
"resource": 0,
"url": "all",
"app": "site",
"state": 1,
"config": 0
},
"demo-hook-all": {
"vendor": "\\Pllano\\Hooks\\HookAll",
"query": "all",
"render": "all",
"routers": 0,
"resource": 0,
"url": 0,
"app": "site",
"state": 0,
"config": 0
},
"security": {
"vendor": "\\Pllano\\Hooks\\Security",
"query": "all",
"render": "all",
"routers": 0,
"resource": 0,
"url": 0,
"app": "site",
"state": 0,
"config": 0
}
}
}
}
用于创建自定义 Hook 的模板
包含两个开发模板。保存并根据需要修改其中一个类。
- 类
HookIndexGet- 仅处理GET请求。默认情况下,应将render模板替换为hooks.html,这样您就可以检查 Hooks 是否正常工作。 - 类
HookAll- 处理所有请求
使用 GET
use Psr\Http\Message\ServerRequestInterface as Request; use Psr\Http\Message\ResponseInterface as Response; use Pllano\Hooks\Hook; $app->get('/', function (Request $request, Response $response, array $args) { // Передать конфигурацию в конструктор $param = []; $query = 'GET'; $app = 'site'; $routers = null; // Если передать пустой массив [] возмет конфигурацию из файла hooks.json // Передаем данные Hooks для обработки ожидающим классам $hook = new Hook($param); $hook->http($request, $response, $args, $query, $app, $routers); $request = $hook->request(); $args = $hook->args(); $hook->setResource('user'); // Начало вашей обработки $view = []; // Массив для шаблонизатора $render = 'index.twig'; // Название файла шаблона // Конец вашей обработки // Передаем данные Hooks для обработки ожидающим классам $hook->get($view, $render); // Подменяем ответ $response = $hook->response(); // Запись в лог $this->logger->info($hook->logger()); // Отдаем данные шаблонизатору return $this->view->render($hook->render(), $hook->view()); });
使用 POST
use Psr\Http\Message\ServerRequestInterface as Request; use Psr\Http\Message\ResponseInterface as Response; use Pllano\Hooks\Hook; $app->post('/post', function (Request $request, Response $response, array $args) { // Передать конфигурацию в конструктор $param = []; // Если передать пустой массив [] возмет конфигурацию из файла hooks.json // Передаем данные Hooks для обработки ожидающим классам $hook = new Hook($param); $hook->http($request, $response, $args, 'POST', 'site'); $request = $hook->request(); $args = $hook->args(); // Начало вашей обработки $callback = []; // Массив для вывода ответа // Выводим заголовки $response->withStatus(200); $response->withHeader('Content-type', 'application/json'); // Конец вашей обработки // Запись в лог $this->logger->info($hook->logger()); // Подменяем ответ $response = $hook->response(); // Выводим json echo json_encode($hook->callback($callback)); });
安装
使用 Composer 连接
{
"require": {
"pllano/hooks": "~1.0.1"
}
}
使用 AutoRequire 连接
{
"require": [{
"namespace": "Pllano\\Hooks",
"dir": "/pllano/hooks/src",
"link": "https://github.com/pllano/hooks/archive/master.zip",
"git": "https://github.com/pllano/hooks",
"name": "hooks",
"version": "master",
"vendor": "pllano",
"state": "1",
"system_package": "1"
}, {
"namespace": "Psr\\Http\\Message",
"dir": "/psr/http-message/src",
"link": "https://github.com/php-fig/http-message/archive/1.0.zip",
"git": "https://github.com/php-fig/http-message",
"name": "http-message",
"version": "1.0",
"vendor": "psr",
"state": "1",
"system_package": "1"
}
]
}