it-swarm.com.ru

Хорошо PHP Библиотека отдыха Api

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

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

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

14
OptimusCrime

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

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

Окей, так что начнем с создания базового класса под названием REST. Этот класс заботится обо всем, что является общим для каждого звонка. Как аутентификация, парсинг запрошенного пути к методу, проверка access_token и т.д.

Одна из центральных вещей в этом классе - запрошенный путь и то, как он переводится в метод. Я сделал это, вдохновленный Laravel. У меня есть массив с 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. Run-скрипт выглядит так:

// 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']);

Я надеюсь, что это поможет вам.

Happy codin '

14
OptimusCrime

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

Он поставляется с 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/

1
Gaz_Edge