2017-03-27 5 views
0

API-appを適切に整理するための基本的な質問があります。一般的な質問ですが、私がLaravelを使っているのは興味深いかもしれません。次のようにLaravelでAPI-appを正しく構成する方法

私の構造は次のとおりです。

  • コントローラクラス内の別の方法を指しているエンドポイントとのREST API。渡されたオブジェクトはRequest型です。
  • コントローラクラスはすべての入力検証(validate-methodsを介して)、認可(gatesを通して)、データベースからのそれぞれのモデルの取得(requestからのidに基づく)を行います。モデルが存在しない場合、エラーを返します。最後に、コントローラは、モデルオブジェクトを渡して、自分のサービスクラス内のそれぞれのメソッドを呼び出します。
  • サービスクラスは、モデルインスタンスに対して異なるアクション(ユーザー名の更新など)を実行し、更新をEloquentを使用して保持し、最後に更新されたモデルインスタンスをコントローラに返します。
  • コントローラは、返されたオブジェクトをjsonレスポンスに「ラップ」してクライアントに返します(成功またはIDを返す代わりに、更新されたオブジェクト全体を返すのと同じです)。

私の質問や問題:

  1. は私のコードの組織はOKか?
  2. 前述のように、検証エラーなどは私のコントローラから投げられます。しかし、サービスの中で何かがうまくいかない場合(つまり、さらに下に行く)どうすればよいでしょうか?どうすれば何かが間違っているとコントローラに伝えることができます。そうすれば、クライアントにJSON応答(例えば403)を返すことができます。例:私のUserServiceは電子メールアドレスを更新しようとします。ただし、この電子メールにはすでにエントリがあるため、サービスはコントローラにエラーを返す必要があります。コントローラはエラーを403 jsonエンコードされたエラーメッセージをクライアントに返します。
  3. 前述のように、すべての検証、承認などは私のコントローラで行われます。コントローラのメソッドは特にHTTPリクエスト用に作られているので、Requestオブジェクトを入力として受け取り、jsonを返します。これらのメソッドを別のコントローラなどのアプリケーション内から直接呼び出す場合はどうすればよいですか?それぞれのサービスクラスを直接呼び出すと、コントローラ内で実行されるすべての検証とチェックの恩恵を受けることはできません。しかし、私がコントローラを呼び出すと、Requestオブジェクトが入力として期待され、明らかに別のコントローラから呼び出すときには欲しくないJsonのHTTPレスポンスが返されます。私はこれをどのようにするべきですか?

私の問題が十分にはっきりしていることを願っています!どんな助けも高く評価されます。

おかげで、 マイケル

答えて

1

は、私はこれらの事のカップルに答えることができます。

  1. 私はAPIにとっては大丈夫だと思います。 APIロジックとアプリケーションロジックを分離してください。私がこれを行う方法は、ルーティング経由です。 /api/{version}/...を例にとる。 (SQL例外などのような)予期せぬエラーを処理し、これらの例でresponse()->json([...], 403);を返すように

  2. 使用try { ... } catch { ... }ブロック。

  3. guzzle/httpを使用して、アプリケーション内のルート/コントローラからの要求を送信するためにパッケージ(あなたcomposer.jsonにし、composer installまたはcomposer updateを実行することを含む必要があります)。 GETまたはPOST秒から/api/...までのルートからアプリケーションにアクセスできます。 Requestと認識し、返されたJSON応答を処理する機能を持ちます。例については、http://docs.guzzlephp.org/en/latest/を参照してください。

これはオープンエンドの質問です。あなたのAPIを構築し、発生する特定の問題に対処することをお勧めします。

+0

本当にありがとうございます、それはまさに私が答えとして得ることを望んでいました!何か疑問が生じた場合は、私はやり直して戻ってくるでしょう!どうも!!! – michimaxi

関連する問題