Я немного знаком с 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. Что я уже знаю:
$_GET['url']
вне этого.$_SERVER['REQUEST_URI']
$_SERVER['REQUEST_METHOD']
Как мне проложить маршрут к конечной точке, например, customers/{12345}/orders
получать заказы конкретного клиента с идентификатором 12345
?
Как я могу это сделать?
Самый быстрый способ достичь желаемого — просто использовать FastRoute.
Но где в этом удовольствие 🙂
Тем не менее, я смущен вашей предпосылкой. Это API REST, который будет использоваться другим кодом (например, в телефоне или стороннем веб-приложении), или это правильный веб-сайт, на котором вы просто хотите получить красивые URL-адреса?
Потому что, если это первый случай, то делать причудливый разбор URL совершенно бессмысленно. Вместо того, чтобы возиться с URL, вы должны читать Эта статья. Настоящий REST API не нуждается в причудливом разборе URL.
Я предполагаю, что то, что вы на самом деле делаете, это правильный сайт, но с красивыми URL.
Сначала вам нужно будет реализовать механизм маршрутизации, который берет список шаблонов регулярных выражений, сопоставляет их с предоставленным вами URL (который вы могли бы извлечь из $_GET['url']
или, может быть $_SERVER[REQUEST_URI]
(ваш код на самом деле не заботится о том, откуда был собран URL-адрес … вы не должны обращаться к суперглобалам внутри функций / классов).
Простая версия этого объясняется в этот ответ. Мне лень переписывать все это = P
Вторая (и крайне необязательная) часть — это создание кода, который бы принимал удобочитаемую запись маршрута (например: /users/{id|[0-9]+}
в качестве примера) и превращая его в регулярное выражение, которое может быть потребляются вашим механизмом маршрутизации.
Если вы решили использовать удобочитаемые нотации, то есть два основных направления:
Что касается того, «как может выглядеть конечный результат», вы, вероятно, можете посмотреть на пример кода Вот. Это иллюстрирует одну из доступных опций для открытого интерфейса маршрутизатора.
TL; DR
Ваш вопрос расплывчат, и трудно понять, что именно будет для вас полезным.
Других решений пока нет …