Laravel 4: Best Practice per tagliare l'input prima della validation

Ora, rifilo separatamente per ciascun input come sotto il codice:

$username = trim(Input::get('username')); $password = trim(Input::get('password')); $email = trim(Input::get('email')); $validator = Validator::make(arrays('username' => $username, 'password' => $password, 'email' => $email), arrays('username' => 'required|min:6', 'password' => 'required|min:6', 'email' => 'email')); 

C'è qualche approccio per fare Trim allo stesso tempo con

Input::all() o Input::only('username', 'password', 'email') ?

E qual è la migliore pratica per fare questo?

Nota: questa soluzione non functionrà se uno degli ingressi è costituito da matrici (come "dati []").

Puoi provare questo, tagliare usando questa linea di codice prima della validation:

 Input::merge(arrays_map('trim', Input::all())); 

Ora fai il resto della tua codifica

 $username = Input::get('username'); // it's trimed // ... Validator::make(...); 

Se vuoi escludere alcuni input dal taglio, puoi usare invece following if if all()

 Input::except('password'); 

O puoi usare

 Input::only(arrays('username')); 

Aggiornamento : poiché gli Laravel 5.4.* Vengono tagliati a causa del nuovo middleware TrimStrings . Quindi, non c'è bisogno di preoccuparsi perché questo middleware viene eseguito su each richiesta e gestisce anche gli input degli arrays.

A seconda del progetto, il sotto potrebbe essere troppo invadente / generalizzato / ecc per le tue esigenze; personalizzare secondo necessità.

  • Sto facendo uso di questa piccola function di mappa arrays ricorsiva per elaborare arrays di input senza errori.
  • Qualsiasi field chiamato password (e la sua conferma) è escluso dal momento che le persone potrebbero voler utilizzare lo spazio come parte di ulteriori oscuramento delle password.
  • Lo spazio ha un significato speciale in alcuni tipi di text. Ad esempio in Markdown, due o più spazi alla fine di una row inseriscono <br> . Anche se probabilmente non ne avrai bisogno all'inizio o alla fine del blob. YMMV.

app/helpers.php

 /** * @param callable $callback * @param arrays $arrays * * @return mixed * * @link http://php.net/manual/en/function.arrays-map.php#112857 */ function arrays_map_recursive($callback, $arrays) { foreach ($arrays as $key => $value) { if (is_arrays($arrays[$key])) { $arrays[$key] = arrays_map_recursive($callback, $arrays[$key]); } else { $arrays[$key] = call_user_func($callback, $arrays[$key]); } } return $arrays; } 

app/filters.php

 App::before( function (\Illuminate\Http\Request $request) { // Trim all input $request->merge( arrays_map_recursive( "trim", arrays_except( $request->all(), ["password", "password_confirmation"] ) ) ); } ); 

Forse puoi usare la function arrays_map di php, per tagliare il contenuto del tuo arrays di input.

 $validator = Validator::make(arrays_map('trim',Input::all()), arrays('username' => 'required|min:6', 'password' => 'required|min:6', 'email' => 'email')); 

O se vuoi una variabile che puoi usare in un secondo momento:

 $inputs = arrays_map('trim', Input::only('username', 'password', 'email')) 
 $attributes = Input::only('username', 'password', 'email'); foreach ($attributes as &$value) { $value = trim($value); //and any further preprocessing you want } $validator = Validator::make($attributes, arrays( 'username' => 'required|min:6', 'password' => 'required|min:6', 'email' => 'email' )); //now you may pass preprocessed $attributes to the model create() method, //still having the original input untouched if you may need it 

In genere, utilizzo questo approccio anche per sostituire i valori facoltativi con null quando sono vuoti, perché preferisco archiviarli in DB come NULL anziché stringhe vuote.

È preferibile eseguire il ritaglio nel model anziché nei controller perché non è necessario duplicare il codice in tutti i controller per ritagliare le stesse cose più e più volte:

 public function setUsernameAttribute($value) { $this->attributes['username'] = trim($value); } 

In questo modo, non dovrai mai ricordare di tagliare qualsiasi attributo del model nei tuoi controller. Il model si prenderà cura di esso e non dovrai più preoccupartene.

Per quanto riguarda il ritaglio di tutto in una volta, individualmente, penso che la differenza sia così piccola che nessun essere umano potrebbe mai notare la differenza.

Una combinazione di quanto sopra è la migliore. Generalmente si desidera filtrare su tutti gli input tranne i campi password e password_confirmation. Anche farlo con una sola row in un filter è bello.

// app / filters.php

 App::before(function($request) { // Trim all input Input::merge(arrays_map('trim', Input::except(['password', 'password_confirmation']))); }); 

un miglioramento nel codice di Halil Özgür per rimuovere tutti gli spazi, <br> , <br> , <br class="asdasd"> , &nbsp , ecc

 // filters.php App::before(function (\Illuminate\Http\Request $request) { $request->merge( arrays_map_recursive( "preg_replace", arrays_except( $request->all(), ["password", "password_confirmation"] ) ) ); }); // helpers.php function arrays_map_recursive($callback, $arrays) { foreach ($arrays as $key => $value) { if (is_arrays($arrays[$key])) { $arrays[$key] = arrays_map_recursive($callback, $arrays[$key]); } else { $arrays[$key] = call_user_func_arrays($callback, ['#(( ){0,}<br( {0,})(/{0,1})>){1,}$#i', '', $arrays[$key]]); } } return $arrays; }