2016-12-04 5 views
0

私は、REST API用のPHPクライアントを最初から作成します。私はGuzzle libraryの使用を検討します。APIクライアントに適したアーキテクチャは何ですか?

私は、リクエストオブジェクト(カスタムxxxRequestクラスからのものなど)のような移送物を処理する必要はなく、ビジネスオブジェクト/サービスクラスのみを処理する必要があると思います。しかし、私が間違っている可能性があります...

可能なアーキテクチャの例を次に示します。どちらが良い習慣を尊重し、なぜですか?
気軽に改善するか、より良い方法を提案してください。


例1:

class ApiClient { 
    function createBooking (BookingEntity $booking, CustomerEntity $customer) { 
     //... 
    } 
} 

この例では、ユーザーが唯一のビジネスオブジェクトを使用することができますが、ApiClientクラスはまた... APIは、メソッドの多くを必要とする場合汚いことを始めることができますフィーチャを追加する場合は、ApiClientを変更する必要があります。


例2:

class ApiClient { 
    function execute(CreateBookingRequest $createBookingRequest) { 
     //... 
    } 
} 

class CreateBookingRequest { 
    private BookingEntity $booking; 
    private CustomerEntity $customer; 
    private $queryParams; 

    public createQueryParams() { 
     // to create the query params (from the attibutes) for the http client 
    } 
} 

ここでは新機能はApiClientを変更することがされていない必要がある場合には、単に新しいクラスを作成する必要があります。しかし、ユーザーは、Request接尾辞で指定されたクラスを扱わなければなりません。 IMO彼は要求や技術的なことについて何も知らない。


例3:

class BookingService { 
    function createBooking (BookingEntity $booking, CustomerEntity $customer) { 
    //... 
    } 
} 

この例では一つの層を追加します。


すべての場合、ApiClient/ServiceクラスのGuices httpClient属性はどこですか? ApiClientクラスはGuzz Clientクラスを拡張する必要がありますか?

答えて

1

さて、そこには実際の基準はありませんが、これは間違いなくホットな話題です。私は、Guzzle特有のものではないとも言います。

短い答え:私は、APIの複雑さに基づいてオプション1と3を選択します。

長い回答:別のリソース(取得、作成、削除などの予約など)がある場合は、オプション3を使用します。API呼び出しが少々ある場合は、 APIの観点から見ればより良い表現であるため(APIクライアントは実際にはAPIの実装にすぎないので、少なくとも理論的にはAPIの規則、用語に従うべきです)、オプション1は高速です最初は理解しやすくなりました。 APIがより複雑になるとメンテナンスが難しくなるので、最終的にはそれをオプション3に書き直す必要があります。

設定済みのGuzzleインスタンスは、クラスのコンストラクタに移動します。

リソース/サービスクラスがある場合は、引き続きAPIクライアントクラスを使用できます。この場合、リソースクラスの設定エントリポイントとファクトリを超えません。

このクライアントを複数のプロジェクトで再利用する予定がある場合は、Guzz 6をすべてインストールできない可能性があるため、HTTP Client抽象化(GuzzleではなくHTTPlugなど)を使用することを検討してください。 )

+0

非常に)

最後には、ではなく、少なくとも、あなたは正確にこれらのケースのためのAPIの基礎/ブートストラップになるだろうthisアウトを確認したいかもしれません(それはまだ終わっていないので、ご自身の責任でそれを使用します興味深い。多くの入力パラメータがある場合、あなたは何をお勧めしますか?例2では、​​xxxRequestクラスの属性としてそれらを入れることができます。 arameters、私たちは例1と3でそれをどのように再現できますか?クラスを追加すると、どのような命名規則が適していますか?当時のxxxParamは、xxxParamの各属性をhttpクライアント(この場合はJSON本体)のクエリパラメータに変換するためのアダプタ関数であるべきですか? – Kwadz

+0

それは完全にあなたのドメインに依存します。多くのパラメータは、通常、まったく無関係なパラメータではなく、ある種のデータ構造を意味します。その場合、私はそれらをモデルクラスに入れます。私はクライアントが実際にインターフェイスの実装であり、APIがデータモデルを公開している可能性が高いことを再度指摘することができます。これはそのまま使用できます。シリアライゼーションは、クライアント自体の内部で行われます。クライアント自体は、モデルをシリアライズする方法を知っています。必要に応じて、別のシリアライゼーションレイヤーを作成することもできますが、依然としてクライアントによって呼び出されます。 –

+0

しかし、createBookingメソッドの入力パラメータとしてモデルオブジェクトがたくさんある場合、それらを単一のオブジェクトにラップするのが良い方法だと私は間違っていますか?例えば、私たちがパラメータを持っているとしましょう:http://pastebin.com/dBKJnk4S私はcreateBookingメソッドの9つの引数を受け入れられないと思います。したがって、それらをラップする必要がありますか?それを行う良い方法は何ですか?これらの授業の明確な接尾辞は何になりますか?それをjson本体に変換するコードはどこにあるべきですか? – Kwadz

関連する問題