2015-12-28 4 views
2

Я немного знаком с PHP MVC. Скажем, у меня есть контроллер так:Маршрутизация в RESTful API в PHP

class Customers{ 

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

    } 
} 

В моей странице bootstraping, я могу захватить браузер 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?

Как это сделать?

+0

заменить идею использования переменных '$ _GET' с отправкой заголовков' $ _SERVER' http. Кроме того, чтобы быть понятным, вы все равно можете использовать '$ _GET' querystrings без участия браузера, так что это не ваш лимитирующий фактор. Вы все равно можете использовать '$ _POST'. Вы экспериментировали с использованием MVC Framework, например CodeIgniter или Zend, поскольку проблемы маршрутизации уже позаботились, или вы больше приклеены к идее вручную создать модель MVC самостоятельно? –

+0

@ LionelRitchietheManatee 1. Я знал, что все еще могу использовать '$ _GET', то, что я не знал, было' $ _GET ['url'] '2. Да, я больше привязан к идее создания вручную модели MVC. На самом деле, именно поэтому я задаю этот вопрос. Я хочу узнать, как это сделать. –

+0

Я полностью понимаю. Когда вы ссылаетесь на использование '$ _GET ['url']', вы ссылаетесь на именованный параметр запроса, такой как '? Url = www.something.com', или вы ссылаетесь на сам URL как' $ _SERVER [HTTP_HOST] 'и '$ _SERVER [REQUEST_URI]'? –

ответ

2

Самый быстрый способ добиться того, что вы хотите, это просто использовать FastRoute.
Но где забава в этом :)

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

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

я буду считать, что вы на самом деле makingis правильный сайт, но с довольно URL.

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

Простая версия этого объясняется в this answer.Я должен лениться, чтобы переписать все это = P

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

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

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

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

TL; DR

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

+0

Прошу прощения, если в моем вопросе я не понял. Я думал, что все до «Теперь я хочу реализовать RESTful API с использованием шаблона MBC» подразумевал, что я говорю о нормальном веб-сайте, и что все, оттуда, говорило об API в MVC-подобной структуре. –