it-swarm.com.de

Wie kann ich auf Abfragezeichenfolgenparameter für Anforderungen zugreifen, die ich manuell gesendet habe? Laravel 4?

Ich schreibe eine einfache API und erstelle eine einfache Webanwendung auf dieser API.

Da ich meine eigene API direkt konsumieren möchte, habe ich zuerst gegoogelt und diese Antwort auf StackOverflow gefunden, die meine ursprüngliche Frage perfekt beantwortet: Meine eigene Laravel API konsumieren

Das funktioniert großartig, ich kann auf meine API zugreifen, indem ich etwas mache wie:

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

Das ist toll! Mit meiner API können Sie der GET-Abfragezeichenfolge jedoch auch einen optionalen fields -Parameter hinzufügen, um bestimmte Attribute anzugeben, die zurückgegeben werden sollen, z.

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

Die Art und Weise, wie ich das in der API mache, ist in etwa wie folgt:

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

Ich würde davon ausgehen, dass ich etwas Ähnliches tun könnte, wie ich es zuvor mit dem parameterlosen Ansatz für Abfragezeichenfolgen getan habe:

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

ABER es scheint nicht so. Kurz gesagt, nach dem Durchlaufen des Codes scheint das Objekt Request korrekt erstellt worden zu sein (und es zieht die Felder Parameter korrekt heraus und weist ihr id, color zu) und das Route scheint in Ordnung zu sein, aber in meinem API-Controller selbst weiß ich nicht, wie ich auf den Parameter field zugreifen soll. Die Verwendung von Input::get('fields') (das ist, was ich für "normale" Anfragen verwende) gibt nichts zurück, und ich bin ziemlich sicher, dass dies daran liegt, dass die statische Input auf die eingehende ursprüngliche Anfrage verweist oder diese abdeckt, NICHT auf die neue Anfrage, die ich "manuell" von gesendet habe innerhalb der App selbst.

Meine Frage ist also wirklich, wie ich das machen soll. Mache ich etwas falsch? Idealerweise möchte ich vermeiden, dass in meinem API-Controller etwas Hässliches oder Besonderes geschieht. Ich möchte Input :: get für die intern versendeten Anforderungen verwenden können und muss keine zweite Prüfung usw. durchführen.

9
Kevin Mitchell

Sie haben Recht damit, dass Input tatsächlich auf die aktuelle Anfrage verweist und nicht auf Ihre neu erstellte Anfrage. Ihre Eingabe ist in der Anforderungsinstanz selbst verfügbar, die Sie mit Request::create() instanziieren.

Wenn Sie (wie Sie sollten) Illuminate\Http\Request zum Instanziieren Ihrer Anfrage verwendet haben, können Sie $request->input('key') oder $request->query('key') verwenden, um Parameter aus der Abfragezeichenfolge abzurufen.

Jetzt besteht das Problem darin, dass Sie möglicherweise Ihre Illuminate\Http\Request-Instanz nicht in der Route verfügbar haben. Eine Lösung (um die Input-Fassade weiterhin verwenden zu können) besteht darin, den Eingang der aktuellen Anforderung physisch zu ersetzen und ihn dann zurückzuschalten.

// 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);

Dies sollte funktionieren (theoretisch) und Sie sollten Ihre ursprüngliche Anforderungseingabe weiterhin verwenden können, bevor und nachdem Ihre interne API-Anforderung erfolgt ist.

18
Jason Lewis

Ich war auch gerade mit diesem Problem konfrontiert und dank Jasons großartiger Antworten konnte ich es funktionieren lassen. 

Ich wollte nur hinzufügen, dass ich herausgefunden habe, dass die Route auch ersetzt werden muss. Andernfalls gibt Route::currentRouteName() die abgesendete Route später im Skript zurück.

Weitere Details dazu finden Sie in meinem Blogbeitrag .

Ich habe auch einige Tests für das Stacking-Problem durchgeführt und interne API-Methoden mit diesem Ansatz wiederholt aus dem Inneren aufgerufen. Es hat gut geklappt! Alle Anforderungen und Routen wurden korrekt eingestellt.

2
santacruz

Wenn Sie eine interne API aufrufen und Parameter über ein Array übergeben möchten (anstelle der Abfragezeichenfolge), können Sie Folgendes tun:

$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

Ref: Laravel: Aufruf Ihrer eigenen API

0
Tho