Задать вопрос
@toorr2p
http://github.com/Cleverscript

Как выбрать из таблицы нужный раут REST API?

Здравствуйте, подскажите как можно получить из таблицы только нужную запись, в которой содержится путь (раут) для эндпоинта REST API.

Рауты хранятся в таблице для того что бы пользователь добавлял их туда через web интрфейс админки (на случай вопроса - зачем рауты хранить в БД).

681bc30db1dda104824384.png

И к примеру обращение идет по такому пути
/rest/v1.0.0/users/group/1/count/10

как из таблицы с раутами получить запись с ID = 3 что бы не выбирать все, и потом не искать регуляркой соответствие на уровне кода PHP?
  • Вопрос задан
  • 61 просмотр
Подписаться 1 Простой 2 комментария
Пригласить эксперта
Ответы на вопрос 2
@rPman
Это таблица роутов, вызывается на каждый запрос, настоятельно рекомендую продумать способ ее кеширования на бакэнде, отслеживая изменения в базе (если cgi то запрос на дату последнего изменения, если приложение-как-веб-сервер то через ивенты).

Я бы однократно (на каждое изменение списка роутов в базе) формировал бы php скрипт или лучше единое регулярное выражение (скорость на порядки будет выше), который бы давал ответ, какой это именно роут (просто собрать все строки через | и каждому дать имя по его id)
Ответ написан
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Напрямую никак.
Не видя всех роутов, мы не знаем, что, например, параметр для 1 называется id, а для 10 - cnt. И, к примеру, 'group' - это часть пути или какой-то строковый параметр? Сможете сказать, видя только роут и не заглядывая в таблицу?
Можно попробовать разбить роут на части, составить из них регулярку и искать по ней в таблице, например что-то вида
SELECT *
  FROM table
  WHERE path REGEXP '\\/(?:users|\\{[a-z]+\\})\\/(?:group|\\{[a-z]+\\})\\/(?:1|\\{[a-z]+\\})\\/(?:count|\\{[a-z]+\\})\\/(?:10|\\{[a-z]+\\})'

Получив шаблон из базы, переделать его и сматчить с роутом:
<?php
preg_match('~/users/group/(?P<id>[^/]+)/count/(?P<cnt>[^/]+)~', '/users/group/1/count/10', $matches);
print_r($matches);

// Array(
//     [0] => /users/group/1/count/10
//     [id] => 1
//     [1] => 1
//     [cnt] => 10
//     [2] => 10
// )
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы