ООП php: как добавить middleware?

161
17 декабря 2019, 14:40

Всем привет! Есть интерфейс 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?

READ ALSO
Почему Laravel меняет хеш пароля в бд?

Почему Laravel меняет хеш пароля в бд?

Перестает авторизировать пользователя спустя несколько дней после регистрацииВ БД все данные остаются

160
Получить данные массива JSON из URL через PHP скрипт

Получить данные массива JSON из URL через PHP скрипт

Есть данные JSON(многомерный массив(больше трех вложенных друг в друга): https://apitrademc

144
fopen() Для создания .html файлов

fopen() Для создания .html файлов

для проекта делаю загрузку файлов с расширениемhtml

173
Не срабатывает подача запроса к функции

Не срабатывает подача запроса к функции

У меня имеется ссылка name_1 как осуществить запуск функции name('1'); Если я раскладываю приходящие данные через explode

136