@Kirill-Gorelov
С ума с IT

Замена регулярных выражений на микросервисе?

Пилю микросервис по паттерну BFF
И есть у меня прокси, где я беру url запрос и проверяю куда его перенаправить
protected const API_V1_user_PATTERN = '#/api/internal/web/rest/v1/user/(\d+)$#u';
    protected const API_V1_user_up_PATTERN = '/api/internal/rest/v1/user/%d/update/%d';

    protected const API_V1_REST_user_PATTERN = '#/api/internal/rest/web/rest/v1/user/(\d+)$#u';
    protected const API_V1_REST_user_up_PATTERN = '#/api/internal/rest/web/rest/v1/user/%d/update/%d$#u';

    //...

      if (preg_match(self::API_V1_user_PATTERN, $this->uri, $matches) === 1) {
            return new ProxyConfigDto(
                $this->host,
                sprintf(self::API_V1_REST_user_PATTERN, (int)$matches[1])
            );
        }

     if (preg_match(self::API_V1_user_up_PATTERN, $this->uri, $matches) === 1) {
            return new ProxyConfigDto(
                $this->host,
                sprintf(self::API_V1_REST_user_up_PATTERN, (int)$matches[1])
            );
        }


И таких кусков много у меня выходит. Естественно при больших количествах запросов это не то что бы замедляет, но смотрится "неприятно".
И вопрос, как можно избавиться от регулярок для проверки урлов?

p.s. все константы и урлы заменены для примера
  • Вопрос задан
  • 85 просмотров
Пригласить эксперта
Ответы на вопрос 2
vabka
@vabka
Токсичный шарпист
Не знаю, какие роутеры в PHP принято использовать (видел, что либо пользуются тем, что даёт большой фреймворк, либо роутятся на уровне веб-сервера к скриптам)

Но беглый гуглёж словосочетания "php routing library" выдаёт много результатов
Ответ написан
nokimaro
@nokimaro
Меня невозможно остановить, если я смогу начать.
Предлагаю попробовать https://github.com/nikic/FastRoute
Там есть оптимизация регулярок при матчинге роутов, группировка роутов (например неймспейсинг v1, v2 и тд) и возможность добавить кеширование роутов
Это позволит избежать проблем производительности и вынести роутинг в отдельный слой
И запуск методов контроллера или в вашем случае ProxyConfigDto не потребует больше копипасты так как можно будет обойтись одним вызовом в
case FastRoute\Dispatcher::FOUND:
        $handler = $routeInfo[1];
        $vars = $routeInfo[2];
        //return new ProxyConfigDto($handler, $vars)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы