Всем привет! Есть интерфейс IHandler
:
interface IHandler
{
public function handle();
}
Есть класс BaseHandler
class BaseHandler extends BaseTelegram
{
/**
* Refresh current handler
* @throws \Telegram\Bot\Exceptions\TelegramSDKException
*/
protected function refresh()
{
$bot = new Bot();
$bot->handle();
}
}
Есть классы, которые наследуют класс BaseHandler
, например:
class SettingsHandler extends BaseHandler implements IHandler
{
/**
* @return mixed|void
* @throws \Telegram\Bot\Exceptions\TelegramSDKException
*/
public function handle()
{
//отправляем сообщение с настройками в боте
}
}
При получении сообщения от webhook телеграма, я вызываю метод handle()
в классе, который зависит от текущего состояния юзера. Тут все довольно понятно. Но возникла проблема: мне нужно добавить возможность добавления middleware к классам handler'a. Если делать костыльным образом, то это будет выглядеть как простая проверка в handle()
, к примеру:
class SettingsHandler extends BaseHandler implements IHandler
{
/**
* @return mixed|void
* @throws \Telegram\Bot\Exceptions\TelegramSDKException
*/
public function handle()
{
if (!$this->user->isPaid()) {
//отправить сообщение, что у юзера что-то не оплачено
return false;
}
...
}
}
Но каким образом это сделать правильнее? Если мыслить с конца, то я это вижу в виде добавления в класс SettingsHandler
свойства $middlewares
:
class SettingsHandler extends BaseHandler implements IHandler
{
private $middlewares = [
CheckUserPaidMiddleware::class,
//other middlewares
];
public function handle()
{
...
}
}
Но каким образом при вызове метода handle()
в классе сначала вызвать метод handle()
у всех middleware'ов, перечисленных в свойстве, и если все они вернули true, то уже запустить handle()
у Handler'a?
Перестает авторизировать пользователя спустя несколько дней после регистрацииВ БД все данные остаются
Есть данные JSON(многомерный массив(больше трех вложенных друг в друга): https://apitrademc
У меня имеется ссылка name_1 как осуществить запуск функции name('1'); Если я раскладываю приходящие данные через explode