pllano/hooks

API 商店钩子

1.0.2 2018-02-06 00:48 UTC

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 - 拦截并可以更改

  • GETPOST 请求中拦截 Request
  • GETPOST 请求中拦截 Response
  • GET 请求中拦截 View - 模板化引擎的数组
  • GET 请求中拦截 Render - 用于渲染的模板名称
  • POST 请求中拦截 Callback

设置要执行的 Hook 列表

可以通过两种方式通过参数传递 Hook 列表

  • 通过构造函数传递数组 $param = [];
  • 从文件 hooks.json

Hook 配置参数

  • print - 输出调试信息 1 或关闭 0
  • vendor - 完整的类名
  • query - 当触发 GET POSTall 时使用的查询。不能使用零。
  • render - 用于渲染的模板 index.twigall0
  • url - 具体的 URL,使用 /all0(计划改进 * 示例 /article-*.html
  • routers - 路由名称 indexarticle0all
  • resource - 正在访问的表或资源 userall0
  • app - App 类型 - siteadmin - 因为 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"
    }
  ]
}