Я разрабатываю кросс-платформенную систему, и мне нужно создать 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/