16

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

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

このような図書館の経験はありますか?おすすめできることはありますか?

4

2 に答える 2

17

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

このRESTApiについて、Laravel、Sympfony2、Codeigniterの両方を調べました。それらはすべて私が好きな要素と嫌いな要素を持っていました。私の主な関心事は、ユーザーが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-methodである場合は、を呼び出そうとします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__);。これは、run-scriptで使用されます。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']);

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

ハッピーコーディン

于 2013-05-16T22:02:36.720 に答える
2

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

箱から出してすぐに、RESTfulルートとコントローラーが付属し、使いやすい認証が提供されます。簡単なRESTAPIを約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/

于 2013-03-14T10:41:31.470 に答える