2013-03-10 4 views
11

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

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

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

+1

Вот хорошая статья: [REST API, с Symfony2: Правильный путь] (http://williamdurand.fr/2012/08/02/rest-apis-with-symfony2 -право-путь /) – j0k

+0

@ j0k: круто, я посмотрю. возможно, решение может быть таким простым. Благодарю. – OptimusCrime

+0

Как вы поживаете? –

ответ

11

Я получил значок 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', 

Это будет соответствовать любой/пользователь/[номер]. Он также проверяет, какой тип запроса это, поэтому, если это простой метод 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']); 

Надеюсь, что вы все пойдете.

Счастливый упа

+0

Можете ли вы загрузить свой код в GitHub? Потому что мои знания в PHP ограничены, и у моего приложения также есть пользователи. –

+0

@SouravBagchi Мой ответ должен был быть обновлен. Сейчас он устарел. Я бы рекомендовал посмотреть на Slim и использовать это как микросервис.Мой ответ не подразумевался как введение в язык программирования PHP. – OptimusCrime

+0

Спасибо за быстрый ответ. Может ли Slim framework работать с пользовательским управлением? Основная проблема, с которой я столкнулся, - это управление пользователями. Процесс входа в систему с интеграцией Google и Facebook и в моей базе данных MySQL есть некоторые данные, доступ к которым возможен только для входа в систему. –

0

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

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

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

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

Он также поставляется с большой ОРМ, что делает создание ресурсов супер легко

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

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

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

Смежные вопросы