2016-05-18 7 views
0

Ich habe Schwierigkeiten, funktionierende PUT-Routen in meiner Lumen-API zu erstellen. Meine Anfragen erreichen die richtige Route, aber ich kann über $request->all() keine Werte abrufen.PUT-Daten in Lumen erhalten

Ich habe herausgefunden, dass PHP den php://input Stream lesen muss, um den PUT Körper zu bekommen. Dies geschieht in der getContent()-Funktion von Symfony\Component\HttpFoundation\Request. Diese Funktion wird jedoch mehrmals aufgerufen, und da der Eingangspuffer beim Lesen geleert wird, sind die Daten bei Bedarf nicht vorhanden.

Ich fand auch heraus, dass, wenn ich meine Content-Type-Header auf Text/plain setze kann ich $request->json() erfolgreich drucken, aber wenn ich es auf application/json einstellen, ist das Objekt leer.

Irgendwelche Ideen?

PS: Ich bin mir bewusst, dass Sie für HTML-Anfragen den Parameter _method hinzufügen sollten, aber da ich meine Anfragen nicht über HTML mache, sollte der Parameter nicht benötigt werden.

Edit:

Meine Route:

$app->put('settings', '[email protected]'); 

Mein Controller:

class SettingController extends Controller 
{ 
    public function update(Request $request) 
    { 
     print_r($request->all()); 
    } 
} 
+0

Können Sie Ihren Code anzeigen? –

+0

Welcher Teil? In meiner routes.php: '$ api -> put ('settings', 'SettingController @ update');'. In der Update-Methode mache ich einfach 'print_r ($ request-> all())', was leer ist. Ich benutze übrigens das Dingo-Paket. – Martijn

+0

Zeigen Sie Ihre Route und Controller, wenn Sie einen verwenden. –

Antwort

0

ich genau dieses gleiche Problem mit Lumen hatte. In der Öffentlichkeit/index.php hatte ich ersetzen: Die

Illuminate\Http\Request::capture(); 

$app->run($request) 

mit:

$app->run(); 

Hinweis: Wenn Sie nach $ app- das Request-Objekt verwenden> run() (um zB Logging oder Benchmarking durchzuführen) sollten Sie $ app-> request verwenden.

logging_function($app->request); 
+0

Das hat den Trick gemacht! Ich bin mir nicht sicher, warum ich "Illuminate \ Http \ Request :: capture();" an erster Stelle hatte, aber trotzdem – Martijn

0

Der Content-Type Ihrer Anfrage muss entsprechend eingestellt werden. In meinem Fall habe ich JSON-Daten gesendet, also setze ich es auf application/json.

Also, wenn ich geschickt in meinem Anfrage Körper:

{"asd": "asdf"} 

ich diese Antwort mit dem Code aus dem Controller bekam:

Array 
(
    [asd] => asdf 
) 
+0

Nun, das ist das Seltsame: wenn ich den Content-Type auf application/json setze, ist die Antwort leer. Wenn ich es jedoch auf text/plain setze und $ request-> json() 'ausgabe, werden die korrekten Daten ausgegeben. Könnte es etwas mit dem Dingo-API-Paket zu tun haben? – Martijn

+0

Ok, wir haben herausgefunden, Dingo war nicht das Problem; wenn es ausgeschaltet ist, wird das Anfrageobjekt noch zweimal initiiert – Martijn