web-dev-qa-db-ja.com

良いPHP RestApiライブラリ

私はクロスプラットフォームシステムを開発しており、それらを結び付けるためにRESTAPIを作成する必要があります。私はPHPで長い経験があり、これをこのサービスに使用したいと思います。

APIを100%手動で開発することもできますが、開発を容易にする優れたライブラリがいくつかあることを望んでいます。

誰かがこのようなライブラリの経験がありますか?おすすめできることはありますか?

14
OptimusCrime

この質問のバッジ_Popular question_を取得したので、RESTソリューションをどのように実行したかを詳しく説明する時が来たと感じています。

これについては、Laravel、Sympfony2、Codeigniterの両方を調べましたREST Api。これらにはすべて、好きな要素と嫌いな要素がありました。私の主な関心事は、認証を行う方法でした。ユーザーがGoogleまたはFacebookが提供するアプリのaccess_tokenまたはaccess_tokensを使用してログインできる複雑なアルゴリズム。また、フレームワークを完全に制御していると思います。また、上記のフレームワークには、不要で回避が難しいと感じた要素がいくつかありました。これを自分でRESTソリューションにすることにしました。思ったほど難しくはなく、いくつかの方法で実行できます。その方法には、OOPプログラミングに関する知識が必要です。

さて、最初はRESTと呼ばれる基本クラスを作成しました。このクラスは、すべての呼び出しに共通するすべてのものを処理します。認証と同様に、メソッドへの要求されたパスを解析し、_access_token_などをチェックします。

このクラスの中心的なものの1つは、要求されたパスと、これがメソッドにどのように変換されるかです。私はこれをLaravelに触発されて行いました。 key => valueの配列があります。ここで、キーは一致するURLであり、値は実際に呼び出すメソッドです。 LavavelがURLの変数を解析する方法も次のように含めました。

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

これは、任意の/ user/[number]と一致します。また、これがどのタイプのリクエストであるかをチェックするため、これが単純なgetメソッドである場合は、_get_user_id_を呼び出そうとします。 _(:id)_で解析されたものはすべて、そのメソッドを呼び出すときに引数として使用されます(したがって、実際にはget_user_id($id)を呼び出しています)。

認証後、実際のメソッド呼び出しが評価されます。 RESTクラス自体にすべてのメソッド(_get_user_id_など)が必要ではなかったため、RESTクラスを拡張するさまざまなコントローラーにこれらを分割しました。これは、要求されているURLを確認することによって行われます。 /user/(:id)の場合、スクリプトは_userController.php_という名前のコントローラーがあるかどうかを確認します。存在する場合は、呼び出すメソッドが存在するかどうかを確認します。もしそうなら、引数の数が私たちが持っているものと一致するかどうかを確認してください。すべてが良好な場合はメソッドを実行し、そうでない場合はエラーメッセージを返します。このようなAPIを作成する場合、構造とエラーメッセージは非常に重要です。

さまざまなコントローラーで、RESTクラスのコンストラクターを呼び出して、認証、URLの解析などを解決します。ここで注意が必要なのは、やりたくなかったことです。

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

すべてのコントローラーの下部にあります。そこで、小さなハックと_run.php_というスクリプトを作成しました。このスクリプトは、すべてのコントローラークラスに対してこれを動的に実行します。 _run.php_を含める前に、$path = explode('/',__FILE__);を実行するだけでコントローラーのパスを保存します。これは、実行スクリプトで使用されます。実行スクリプトは次のようになります。

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

それで皆さんがうまくいくことを願っています。

ハッピーコデイン '

15
OptimusCrime

私は3ヶ月前に同じ質問をしました。私は何時間もかけて、使用するのに最適なPHPフレームワークを研究しました。結局、 Laravel に落ち着きました。

箱から出してすぐに、RESTfulルートとコントローラーが付属し、使いやすい認証が提供されます。簡単なREST APIを約1日で稼働させました

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