it-swarm.com.de

Gut PHP Rest Api-Bibliothek

Ich entwickle ein plattformübergreifendes System und muss eine Rest-API erstellen, um sie miteinander zu verbinden. Ich habe langjährige Erfahrung in PHP und möchte dies für diesen Dienst nutzen.

Ich könnte eine API zu 100% manuell entwickeln, aber ich hoffe, es gibt einige großartige Bibliotheken, die meine Entwicklung erleichtern könnten.

Hat jemand Erfahrung mit Bibliotheken wie dieser? Kannst du alles empfehlen?

14
OptimusCrime

Ich habe das Abzeichen Popular question für diese Frage erhalten, so dass es an der Zeit ist, zu erläutern, wie ich meine REST-Lösung erledigt habe.

Ich habe mir Laravel, Sympfony2 und Codeigniter für diese REST Api angesehen. Sie hatten alle einige Elemente, die ich mochte, und andere, die ich nicht mochte. Mein Hauptanliegen war, wie die Authentifizierung durchgeführt werden sollte, da ich einen ziemlich komplexen Algorithmus hatte, bei dem sich meine Benutzer mit access_token oder access_tokens der Apps anmelden können, die von Google oder Facebook bereitgestellt werden. Ich habe auch die Kontrolle über mein Framework und die oben erwähnten Frameworks hatten einige Elemente, die ich für unnötig hielt und schwer zu umgehen war. Aus diesem Grund entschied ich mich, meine eigene REST-Lösung zu entwickeln. Es ist nicht so schwer, wie man es erwarten könnte, und es kann auf verschiedene Arten geschehen. Meine Art und Weise erfordert einige Kenntnisse der OOP-Programmierung.

Okey, also machte ich eine Basisklasse namens REST. Diese Klasse kümmert sich um alles, was bei jedem Anruf gemeinsam ist. Wie bei der Authentifizierung: Analysieren des angeforderten Pfads zu einer Methode, Prüfen von access_token usw.

Eines der zentralen Dinge in dieser Klasse ist der angeforderte Pfad und wie dieser in eine Methode übersetzt wird. Ich habe das von Laravel inspiriert. Ich habe ein Array mit key => value, wobei der Schlüssel die URL ist, der er entsprechen soll, und der Wert die eigentliche aufzurufende Methode ist. Ich habe auch die Art und Weise, wie Lavavel Variablen in der URL analysiert, so eingefügt:

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

Dies würde zu einem beliebigen/user/[number] passen. Er prüft auch, um welche Art von Anforderung es sich handelt. Wenn dies eine einfache get-Methode ist, würde er versuchen, get_user_id aufzurufen. Alles, was mit (:id) analysiert wird, wird als Argument verwendet, wenn diese Methode aufgerufen wird (dh sie ruft tatsächlich get_user_id($id) auf).

Nach der Authentifizierung wird der aktuelle Methodenaufruf ausgewertet. Ich wollte nicht alle Methoden (wie get_user_id) in der REST-Klasse selbst haben, also habe ich diese in verschiedene Controller aufgeteilt, die die REST-Klasse erweitern. Dies geschieht durch Betrachten der angeforderten URL. Bei /user/(:id) prüft das Skript, ob es einen Controller mit dem Namen userController.php gibt. Wenn es existiert, prüfen Sie, ob die von uns aufgerufene Methode existiert. Wenn dies der Fall ist, prüfen Sie, ob die Anzahl der Argumente mit der von uns angegebenen übereinstimmt. Wenn alles in Ordnung ist, führen Sie die Methode aus, falls keine Fehlermeldung angezeigt wird. Struktur und Fehlermeldungen sind sehr wichtig, wenn Sie eine solche API erstellen. 

In den verschiedenen Controllern rufe ich den Konstruktor für die REST-Klasse auf, um die Authentifizierung, das Analysieren der URL usw. aufzulösen. Das schwierige daran ist, dass ich das nicht wollte:

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

Im unteren Bereich jedes Controllers. Also machte ich einen kleinen Hack und ein Skript namens run.php, das dies dynamisch für jede Controller-Klasse macht. Bevor ich den run.php einfüge, speichere ich den Pfad für den Controller durch einfaches Ausführen von $path = explode('/',__FILE__);. Dies wird im Run-Skript verwendet. Das Run-Skript sieht folgendermaßen aus:

// 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();

Ich habe festgestellt, dass dies eine perfekte Lösung für die Erstellung meiner API ist. Ich kann leicht neue Methoden hinzufügen, indem ich sie in das Array einfüge, das URLs zu Methoden analysiert, und ich kann neue Methoden in die auseinandergefalteten Controller einfügen, um maximale Sauberkeit zu gewährleisten.

Einige Leute mögen denken, dass dies zu viel Arbeit ist, aber ich habe tatsächlich nur ein paar Stunden gebraucht, um die Arbeit zu beginnen. Ich würde das auch als sehr dynamisch bezeichnen, da ich einfach neue Controller hinzufügen kann und das System sie erkennt, wenn es sich um gültige URL-Muster handelt.


Ein paar freundliche Ratschläge.

Wenn Sie sich für etwas entscheiden, das dieser Lösung ähnelt, können dies einige gute Tipps sein. Führen Sie in jedem Controller Folgendes aus:

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();
}

Wir müssen speichern, aus welcher Klasse wir gerade arbeiten. Dies wäre UserController oder so ähnlich.

In der REST-Klasse kann ich dann anhand dieser Variablen prüfen, ob die tatsächlich aufgerufene Methode in diesem Controller vorhanden ist. Ich habe das so gemacht:

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

Ich hoffe, das bringt dich alle zum Laufen.

Happy codin '

14
OptimusCrime

Ich hatte vor drei Monaten dieselbe Frage. Ich verbrachte viele Stunden damit, die besten PHP-Frameworks zu erforschen. Am Ende entschied ich mich für Laravel

Sofort einsatzbereit sind RESTful-Routen und -Controller sowie eine einfach zu verwendende Authentifizierung. Ich hatte eine einfache REST API, die in etwa einem Tag betriebsbereit war

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

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

Es kommt auch mit einem großartigen ORM, der das Einrichten von Ressourcen sehr einfach macht

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

Ich benutze Version 3.2 und funktioniert wie ein Zauber und ist stabil. Version 4 befindet sich noch in der Beta-Phase, hat jedoch viel mehr REST orientierte Funktionen (ich denke, eine ist, dass es einfacher ist, Ressourcen innerhalb Ihrer Controller zu erstellen).

Tolles Tutorial hier http://net.tutsplus.com/tutorials/php/laravel-4-a-start-at-a-restful-api/

1
Gaz_Edge