10

私は単純な API を作成しており、この API の上に単純な Web アプリケーションを構築しています。

私は直接「自分の API を消費」したいので、最初に Google で調べて、最初の質問に完全に答える StackOverflow でこの回答を見つけました: Consuming my own Laravel API

これでうまくいきました。次のようにして API にアクセスできます。

$request = Request::create('/api/cars/'.$id, 'GET');
$instance = json_decode(Route::dispatch($request)->getContent());

これは素晴らしい!ただし、私の API では、GET クエリ文字列にオプションのfieldsパラメータを追加して、次のように返される特定の属性を指定することもできます。

http://cars.com/api/cars/1?fields=id,color

APIでこれを実際に処理する方法は、次のようなものです。

public function show(Car $car)
{
     if(Input::has('fields'))
     {
          //Here I do some logic and basically return only fields requested
          ....
     ...
 }

以前にクエリ文字列パラメーターを使用しないアプローチで行ったのと同様のことができると思います。次のようなものです。

$request = Request::create('/api/cars/' . $id . '?fields=id,color', 'GET');
$instance = json_decode(Route::dispatch($request)->getContent());

しかし、そうではないようです。簡単に言えば、コードをステップ実行した後、オブジェクトが正しく作成されたように見え (そして、 fieldsパラメーターをRequest正しく引き出してid,colorを割り当てたようです)、Route は正常にディスパッチされたように見えますが、API コントローラー自体の中でフィールドパラメータへのアクセス方法がわかりません。Using (これは私が「通常の」リクエストに使用するものです) は何も返しません。これは、静的が最初のリクエストを参照またはスコープしているためであり、「手動で」内部からディスパッチした新しいリクエストではないためです。アプリ自体。Input::get('fields')Input

だから、私の質問は本当にどうすればいいですか?私は何か間違ったことをしていますか?理想的には、API コントローラーで醜いことや特別なことをするのを避けたいです。内部でディスパッチされたリクエストに Input::get を使用でき、2 回目のチェックを行う必要がないようにしたいなどです。

4

3 に答える 3

19

Inputusingは実際には現在のリクエストを参照しており、新しく作成したリクエストではないという点で正しいです。入力は、インスタンス化したリクエスト インスタンス自体で使用できますRequest::create()

Illuminate\Http\Requestリクエストをインスタンス化するために(本来あるべきように)使用していた場合は、$request->input('key')または$request->query('key')を使用してクエリ文字列からパラメーターを取得できます。

ここでの問題はIlluminate\Http\Request、ルートでインスタンスを使用できない可能性があることです。ここでの解決策 (ファサードを引き続き使用できるようにするためInput) は、現在のリクエストの入力を物理的に置き換えてから元に戻すことです。

// Store the original input of the request and then replace the input with your request instances input.
$originalInput = Request::input();

Request::replace($request->input());

// Dispatch your request instance with the router.
$response = Route::dispatch($request);

// Replace the input again with the original request input.
Request::replace($originalInput);

これは (理論的には) 機能するはずであり、内部 API リクエストが行われる前後に元のリクエスト入力を引き続き使用できるはずです。

于 2013-05-17T02:25:19.220 に答える
2

私もこの問題に直面していましたが、ジェイソンのすばらしい回答のおかげで、うまくいくことができました。

ルートも交換する必要があることがわかりました。それ以外の場合Route::currentRouteName()は、スクリプトの後半でディスパッチされたルートが返されます。

詳細については、私のブログ投稿を参照してください。

また、スタッキングの問題についていくつかのテストを行い、このアプローチで内部 API メソッドを相互に繰り返し呼び出しました。うまくいきました!すべてのリクエストとルートが正しく設定されています。

于 2013-06-12T23:45:06.053 に答える
0

内部 API を呼び出して、(クエリ文字列ではなく) 配列を介してパラメーターを渡したい場合は、次のようにすることができます。

$request = Request::create("/api/cars", "GET", array(
   "id" => $id,
   "fields" => array("id","color")
));
$originalInput = Request::input();//backup original input
Request::replace($request->input());
$car = json_decode(Route::dispatch($request)->getContent());//invoke API
Request::replace($originalInput);//restore orginal input

参照: Laravel : 独自の API を呼び出す

于 2015-04-21T16:11:04.097 に答える