2016-08-03 32 views
3

In meinem Controller auf null erhalten eine Illuminate\Http\Request anfordern, die einige Daten mit Werten, die gleich einer leeren Zeichenfolge enthält:Änderungsanforderung Eingabewerte aus leeren String in Laravel

dd($request->input()) 

//output 
array:5 [▼ 
    "_token" => "K43q88mR5zQRqVPAuYX5IWtQ1khQ24JTsuxl8mz4" 
    "param1" => "1" 
    "param2" => "2" 
    "param3" => "" 
    "param4" => "" 
] 

(im Grunde das passiert, wenn der Benutzer hatte gemacht in Form keine Auswahlen erstellen, aber aufgrund Frontend Einschränkungen see here, mir nicht in der Lage bin, die Form des Antrags zu ändern, so von den leeren String-Werte auszuschließen)

die requ an den Server gesendet werden est Eingabedaten werden verwendet, um Beziehungen zu Modellen anzuhängen. Zum Beispiel:

$book->authors()->attach($request->input('param1')); 

Das Problem ist, dass, wenn der Eingabewert auf die leere Zeichenfolge "" die obige Zeile ein QueryException gleich wirft, da sie einen Fremdschlüssel gleich "" zur Schwenk Tabelle hinzuzufügen versucht.

Auf der anderen Seite habe ich festgestellt, dass, wenn der Wert null ist statt "", die attach() Methode nicht ausgeführt wird und somit keine Ausnahme wirft, weder die Datenbank aktualisiert, die genau das Verhalten, das ich will, wenn der Benutzer im Eingabeformular keine Auswahl getroffen hat.

Meine Frage ist Wie kann ich die Anfrage Werte von "" zu null ändern? Mein erster Gedanke war, eine Hilfsfunktion zu erstellen, die über das Anforderungseingabearray iteriert und "" mit Null ersetzt und sie in der Steuerung verwendet. ABER es scheint keine gute Idee für mich zu sein, da dies mögliche unerwünschte Validierungsfehler nicht verhindern würde , wenn Sie die Formularanforderungsvalidierung verwenden.

Irgendwelche Ideen bitte ???

Vielen Dank im Voraus

Antwort

6

HINWEIS: Laravel 5.4 jetzt Schiffe mit dieser Funktion

https://laravel.com/docs/5.4/requests#input-trimming-and-normalization

Für Versionen> 5.4 Siehe Antwort unten oder einfach nur die offiziellen Middle kopieren.


HTTP middleware provide a convenient mechanism for filtering HTTP requests entering your application.

eine Middleware-Stellen und weisen Sie auf den Routen oder Controller Methoden Sie es Platz nehmen wollen.

Beispiel:

class SanitizeMiddleware 
{ 
    /** 
    * Handle an incoming request. 
    * 
    * @param \Illuminate\Http\Request $request 
    * @param \Closure $next 
    * @return mixed 
    */ 
    public function handle($request, Closure $next) 
    { 
     foreach ($request->input() as $key => $value) { 
      if (empty($value)) { 
       $request->request->set($key, null); 
      } 
     } 

     return $next($request); 
    } 
} 
Route::post('/users', function (Request $request) { 

    dd($request->input()); 

})->middleware(SanitizeMiddleware::class); 
+1

Danke dafür, aber jeder, der es benutzt, möchte vielleicht explizit nach der Zeichenkette '0' suchen, die absolut gültig ist. 'if ($ Wert! == '0' && leer ($ Wert)) {' –

0

Können Sie sich nicht überprüfen, bevor Sie einen Artikel auf die Pivot-Tabelle hinzufügen?

if(!empty($request->input('paramX'))){ 
    $book->authors()->attach($request->input('paramX')); 
} 
+0

Vielen Dank für Ihre Antwort, die ich acctualy bin mit 'if (! $ Request-> Eingang ('paramX') = "")' für jeden einzelnen Eingabeparameter. Was ich verlange, ist für eine "globalere", ohne dass die if-Anweisung jedes Mal für jeden einzelnen Anfrage-Eingabeparameter eingefügt werden muss. – ira