pllano / hooks
Hooks for API Shop
Installs: 8
Dependents: 0
Suggesters: 0
Security: 0
Stars: 0
Watchers: 1
Forks: 0
pkg:composer/pllano/hooks
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: 2025-10-18 20:36:36 UTC
README
Менеджер Pllano\Hooks\Hook - запускает выполнение ожидающих классов в начале и в конце или в необходимом месте скрипта, передает им информацию для обработки которую они могут подменять или брать из нее данные без подмены. Это дает возможность писать дополнения без вмешательства в код вашей App. Конкретный хук не должен знать когда ему выполнятся, это должен определить менеджер Pllano\Hooks\Hook взяв параметры хука и сравнить их с текущими условиями. Если есть совпадение запустить хук. Задача хука выполнить свою миссию.
Как и где использовать ? Примеры:
- Вы хотите подключить и вести статистику посещаемости сайта. Вы добавляете плагин в список выполнения и только берете данные из Request отдавая их назад без изменения.
- Вам необходимо контролировать все приходящие параметры через POST для того чтобы повысить безопасность. Вы создаете хук и нацеливаете его только на POST запросы. Обрабатываете параметры из массива $post = $request->getParsedBody(); и возвращаете их проверенными и очищенными от лишнего.
- Вы хотите вести черный/белый списки посетителей чтобы повысить защиту от возможных DDoS. Для этого необходимо в первую очередь настроить максимальное кеширование и дописать плагин отсекающий IP с большим количеством обращений к сайту. Также нужен плагин который будет искать на вашем сайте все тяжелые запросы и сообщать вам о них для добавления их в кеш или оптимизацию скриптов.
Hooks - перехватывает и может менять:
RequestвGETиPOSTзапросахResponseвGETиPOSTзапросахView- Массив для шаблонизатора вGETзапросахRender- Название шаблона для рендера - вGETзапросахCallbackвPOSTзапросах
Установить список Hook для выполнения
Передать список Hook можно через param двумя способами:
- Массивом в конструктор
$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 -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
}
}
}
}
Каркасы для создания пользовательских Hooks
В комплекте идет два каркаса для разработки. Сохраните и доработайте один из этих классов в зависимости от необходимости.
- Класс
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"
}
]
}