Хороший PHP Rest Api library

Я разрабатываю кросс-платформенную систему, и мне нужно создать API для отдыха, чтобы связать их вместе. У меня много времени на PHP, и я хочу использовать его для этой службы.

Я мог бы разработать API на 100% вручную, но я надеюсь, что там есть отличные библиотеки, которые могут облегчить мое развитие.

Кто-нибудь имеет опыт работы с такими библиотеками? Все, что вы могли бы порекомендовать?

Я получил значок Popular question по этому вопросу, поэтому я чувствую, что пришло время рассказать, как я сделал свой REST-soluton.

Я рассматривал как Laravel, Sympfony2, так и Codeigniter для этого REST Api. У всех у них были некоторые элементы, которые мне нравились, а некоторые мне не нравились. Моя основная проблема заключалась в том, как сделать аутентификацию, потому что у меня был довольно сложный алгоритм, когда мои пользователи могут входить в систему с помощью access_token или access_tokens приложений, которые обслуживаются Google или Facebook. Я также уверен, что полностью контролирую свои рамки, и упомянутые выше структуры имеют некоторые элементы, которые я чувствовал ненужным и трудным для работы. Из-за этого я решил создать собственное REST-решение. Это не так сложно, как можно было бы ожидать, и это можно сделать несколькими способами. То, как я это делал, требует некоторых знаний о программировании ООП.

Okey, поэтому, начиная с создания базового класса, называемого REST. Этот класс заботится обо всем, что является общим для каждого звонка. Подобно аутентификации, анализируя запрошенный путь к методу, проверяя access_token и т. Д.

Одной из центральных вещей в этом классе является запрошенный путь и способ его перевода в метод. Я сделал это, вдохновленный Ларавелем. У меня есть массив с key => value где ключ – это URL-адрес, который должен соответствовать, и значение является фактическим методом вызова. Я также включил способ, которым Lavavel анализирует переменные в URL-адресе следующим образом:

 '/user/(:id)' => 'user_id', 

Это будет соответствовать любому / user / [number]. Он также проверяет, какой тип запроса это, поэтому, если это простой метод get, он попытается вызвать get_user_id . Все, что анализировалось с помощью (:id) , будет использоваться в качестве аргумента при вызове этого метода (поэтому на самом деле он вызывает get_user_id($id) ).

После аутентификации выполняется фактический вызов метода. Мне не нужны все методы (например, get_user_id ) в самом REST-классе, поэтому я разбил их на разных контроллерах, которые расширяют класс REST. Это делается путем просмотра запрашиваемого URL-адреса. Если это /user/(:id) скрипт проверяет, есть ли контроллер с именем userController.php . Если он существует, проверьте, существует ли метод, который мы собираемся вызывать. Если это так, проверьте, соответствует ли количество аргументов тому, что у нас есть. Если все хорошо, выполните метод, если не вернете сообщение об ошибке. Структура и сообщения об ошибках очень важны при создании API.

В разных контроллерах я вызываю конструктор для REST-класса, чтобы получить аутентификацию, разбор URL-адреса и т. Д. Трудная часть здесь заключается в том, что я не хотел этого делать:

 $controller = new MyController(); $controller->printResponse(); 

В нижней части каждого контроллера. Поэтому я сделал небольшой взлом и скрипт под названием run.php который делает это динамически для каждого класса контроллера. Прежде чем включить run.php я сохраняю путь для контроллера, просто делая $path = explode('/',__FILE__); , Это используется в скрипте run-script. Сценарий запуска выглядит следующим образом:

 // Splitting the file-name, removing the extension $name = explode('.',$path[count($path)-1]); // Uppercasing the first letter to be nice and OOP-ish $classToCall = ucfirst($name[0]); // Creating a new instance $controller = new $classToCall(); // Logging $controller->doLog(); // Printing the final response $controller->printResponse(); 

Я нашел, что это идеальное решение для того, как я хотел создать свой API. Я могу легко добавить новые методы, предоставив их в массиве, который анализирует URL-адреса методам, и я могу добавить новые методы в прекрасно разобранные контроллеры для максимальной чистоты.

Некоторые люди могут подумать, что это слишком много работы, но на самом деле мне потребовалось всего несколько часов, чтобы запустить ее и запустить. Я бы назвал это очень динамичным, так как я могу просто добавить новые контроллеры, и система их распознает, если они будут действительными url-образцами.


Несколько дружеских советов.

Если вы решите пойти с чем-то похожим на это решение, это могут быть некоторые полезные советы. В каждом контроллере выполните следующие действия:

 public function __construct() { // Loading the class-name, setting it in the REST-class, so we can check if it holds the method being called $this->className = get_class($this); // Calling RESTs constructor parent::__construct(); } 

Нам нужно будет сохранить класс, в котором мы сейчас работаем. Это будет UserController или что-то в этом роде.

В REST-классе я могу использовать эту переменную, чтобы проверить, существует ли в этом контроллере фактический метод вызова. Я сделал это так:

 // Checking if the method exists if (method_exists($this->className,$method_name)) { // Check to see if we have the required number of arguments represented $ReflectionClass = new ReflectionClass($this->className); if ($ReflectionClass->getMethod($method_name)->getNumberOfParameters() == count($this->methodUrl['args'])) { $this->response['response'] = call_user_func_array(array($this, $method_name), $this->methodUrl['args']); 

Надеюсь, это поможет вам.

Счастливый codin '

У меня был тот же вопрос три месяца назад. Я потратил много часов на изучение лучших фреймворков PHP для использования. В конце концов я поселился на Ларавеле .

Прямо из коробки он поставляется с маршрутами и контроллерами RESTful и простой в использовании аутентификацией. У меня был простой REST API и работает примерно через день

http://laravel.com/docs/routing#the-basics

http://laravel.com/docs/controllers#restful-controllers

Он также поставляется с большим ORM, который упрощает настройку ресурсов

http://laravel.com/docs/database/eloquent

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

Большой учебник здесь http://net.tutsplus.com/tutorials/php/laravel-4-a-start-at-a-restful-api/