Maintenant, je coupe pour chaque entrée séparément comme ci-dessous le code:
$username = trim(Input::get('username'));
$password = trim(Input::get('password'));
$email = trim(Input::get('email'));
$validator = Validator::make(array('username' => $username,
'password' => $password,
'email' => $email),
array('username' => 'required|min:6',
'password' => 'required|min:6',
'email' => 'email'));
Y a-t-il une approche pour couper en même temps avec
Input::all()
ou Input::only('username', 'password', 'email')
?
Et quelle est la meilleure pratique pour ce faire?
Remarque: Cette solution ne fonctionnera pas si l'une de vos entrées est un tableau (tel que "data []").
Vous pouvez essayer ceci, en utilisant cette ligne de code avant la validation:
Input::merge(array_map('trim', Input::all()));
Maintenant, faites le reste de votre codage
$username = Input::get('username'); // it's trimed
// ...
Validator::make(...);
Si vous souhaitez exclure certaines entrées du découpage, utilisez plutôt l'option suivant si all()
Input::except('password');
Ou vous pouvez utiliser
Input::only(array('username'));
Mise à jour : Depuis Laravel 5.4.*
, les entrées sont supprimées à cause du nouveau TrimStrings
middleware. Inutile donc de vous en préoccuper, car ce middleware s'exécute à chaque requête et gère également les entrées de la matrice.
En fonction de votre projet, la liste ci-dessous peut être trop intrusive/généralisée/etc. pour vos besoins; personnaliser au besoin.
password
(et sa confirmation) est exclu, car les utilisateurs peuvent souhaiter utiliser l'espace pour masquer davantage leurs mots de passe.<br>
. Bien que vous n’ayez probablement pas besoin de cela au début ou à la fin du blob. YMMV.app/helpers.php
/**
* @param callable $callback
* @param array $array
*
* @return mixed
*
* @link http://php.net/manual/en/function.array-map.php#112857
*/
function array_map_recursive($callback, $array)
{
foreach ($array as $key => $value) {
if (is_array($array[$key])) {
$array[$key] = array_map_recursive($callback, $array[$key]);
} else {
$array[$key] = call_user_func($callback, $array[$key]);
}
}
return $array;
}
app/filters.php
App::before(
function (\Illuminate\Http\Request $request) {
// Trim all input
$request->merge(
array_map_recursive(
"trim",
array_except(
$request->all(),
["password", "password_confirmation"]
)
)
);
}
);
Peut-être que vous pouvez utiliser la fonction array_map de php, pour couper le contenu de votre tableau en entrée.
$validator = Validator::make(array_map('trim',Input::all()),
array('username' => 'required|min:6',
'password' => 'required|min:6',
'email' => 'email'));
Ou si vous voulez une variable que vous pourrez utiliser plus tard:
$inputs = array_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, array(
'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
D'habitude, j'utilise également cette approche pour remplacer les valeurs facultatives par null
lorsqu'elles sont vides, car je préfère les stocker dans la base de données sous la forme NULL
plutôt que des chaînes vides.
Il est préférable de couper dans le modèle plutôt que dans les contrôleurs, car vous n'avez pas à dupliquer le code dans tous vos contrôleurs pour couper les mêmes choses encore et encore:
public function setUsernameAttribute($value)
{
$this->attributes['username'] = trim($value);
}
De cette façon, vous ne devez jamais oublier de supprimer les attributs de modèle de vos contrôleurs. Le modèle s'en occupera et vous n'aurez plus jamais à vous en soucier.
En ce qui concerne tout couper en même temps contre individuellement, je pense que la différence est si petite qu'aucun être humain ne remarquerait jamais la différence.
Il suffit d'utiliser TrimStrings
et ConvertEmptyStringsToNull
Middleware.
Vous n'avez rien de plus à faire, car ces middlewares sont intégrés à Laravel 5.4. Voir cet article
Edit: Que faire si je n’utilise pas Laravel 5.4?
Ensuite, assurez-vous que Laravel connaît vos middlewares dans Kernel.php.
middleware protégé = [ // middleware précédent \App\Http\Middleware\TrimStrings :: class, \App\Http\Middleware\ConvertEmptyStringsToNull :: class, ];
Une combinaison de ce qui précède est la meilleure. Généralement, vous souhaiterez filtrer toutes les entrées sauf les champs password et password_confirmation. Nice le fait également avec une seule ligne dans un filtre.
// app/filters.php
App::before(function($request)
{
// Trim all input
Input::merge(array_map('trim', Input::except(['password', 'password_confirmation'])));
});
une amélioration dans Halil Özgür code pour supprimer tous les espaces, <br>
, <br >
, <br class="asdasd">
,  
, etc.
// filters.php
App::before(function (\Illuminate\Http\Request $request) {
$request->merge(
array_map_recursive(
"preg_replace",
array_except(
$request->all(),
["password", "password_confirmation"]
)
)
);
});
// helpers.php
function array_map_recursive($callback, $array)
{
foreach ($array as $key => $value) {
if (is_array($array[$key])) {
$array[$key] = array_map_recursive($callback, $array[$key]);
} else {
$array[$key] = call_user_func_array($callback, ['#(( ){0,}<br( {0,})(/{0,1})>){1,}$#i', '', $array[$key]]);
}
}
return $array;
}