Маршрутизация в RESTful API в переполнении стека

Я немного знаком с PHP MVC. Скажем, у меня есть контроллер вроде так:

class Customers{

public function method1( param1, param2, param3, ..., param_n ){

}
}

На моей странице начальной загрузки я могу получить URL-адрес браузера следующим образом:

$url = explode('/', filter_var(rtrim( $_GET['url'], '/' ), FILTER_SANITIZE_URL));

я делаю $controller = $url[0] а также $method = $url[1], Любые другие элементы в $url после второго индекса находятся параметры и могут быть собраны в переменную массива, скажем $params, Затем я направляю к соответствующему методу и параметрам контроллера, например, так:

call_user_func_array([$controller, $method], $params);

ОБРАТИТЕ ВНИМАНИЕ: Код выше приведен для иллюстрации. Я всегда делаю проверки в реальных ситуациях. Эти проверки здесь не показаны, поэтому не используйте приведенные выше примеры для серьезных проектов.

Теперь я хочу реализовать RESTful API с использованием шаблона MVC. Что я уже знаю:

  1. Нет браузера, поэтому $_GET['url'] вне этого.
  2. Конечная точка получается из $_SERVER['REQUEST_URI']
  3. Метод получен из $_SERVER['REQUEST_METHOD']

Как мне проложить маршрут к конечной точке, например, customers/{12345}/orders получать заказы конкретного клиента с идентификатором 12345?

Как я могу это сделать?

3

Решение

Самый быстрый способ достичь желаемого — просто использовать FastRoute.
Но где в этом удовольствие 🙂

Тем не менее, я смущен вашей предпосылкой. Это API REST, который будет использоваться другим кодом (например, в телефоне или стороннем веб-приложении), или это правильный веб-сайт, на котором вы просто хотите получить красивые URL-адреса?

Потому что, если это первый случай, то делать причудливый разбор URL совершенно бессмысленно. Вместо того, чтобы возиться с URL, вы должны читать Эта статья. Настоящий REST API не нуждается в причудливом разборе URL.

Я предполагаю, что то, что вы на самом деле делаете, это правильный сайт, но с красивыми URL.

Сначала вам нужно будет реализовать механизм маршрутизации, который берет список шаблонов регулярных выражений, сопоставляет их с предоставленным вами URL (который вы могли бы извлечь из $_GET['url'] или, может быть $_SERVER[REQUEST_URI] (ваш код на самом деле не заботится о том, откуда был собран URL-адрес … вы не должны обращаться к суперглобалам внутри функций / классов).

Простая версия этого объясняется в этот ответ. Мне лень переписывать все это = P

Вторая (и крайне необязательная) часть — это создание кода, который бы принимал удобочитаемую запись маршрута (например: /users/{id|[0-9]+}в качестве примера) и превращая его в регулярное выражение, которое может быть потребляются вашим механизмом маршрутизации.

Если вы решили использовать удобочитаемые нотации, то есть два основных направления:

  • встроенные обозначения (см. пример выше или FastRoute)
  • конфигурационный файл (вероятно, JSON или YAML) с обозначениями

Что касается того, «как может выглядеть конечный результат», вы, вероятно, можете посмотреть на пример кода Вот. Это иллюстрирует одну из доступных опций для открытого интерфейса маршрутизатора.

TL; DR

Ваш вопрос расплывчат, и трудно понять, что именно будет для вас полезным.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]