web-dev-qa-db-fra.com

Laravel 4: Meilleure pratique pour réduire les entrées avant la validation

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?

15
Chen-Tsu Lin

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 TrimStringsmiddleware. 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.

48
The Alpha

En fonction de votre projet, la liste ci-dessous peut être trop intrusive/généralisée/etc. pour vos besoins; personnaliser au besoin.

  • Je me sers de this petite fonction de mappage de tableau récursif afin de traiter des tableaux d'entrées sans erreur.
  • Tout champ nommé password (et sa confirmation) est exclu, car les utilisateurs peuvent souhaiter utiliser l'espace pour masquer davantage leurs mots de passe.
  • L'espace a une signification particulière dans certains types de texte. Par exemple, dans Markdown, deux espaces ou plus en fin de ligne insère <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"]
                )
            )
        );
    }
);
6
Halil Özgür

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'))
3
Needpoule
$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.

2
matpop

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.

2
Jake Wilson

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?

  • Copions le code de Github de Laravel. vous pouvez obtenir de ici
  • 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, ];

0
C.V

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'])));

});
0
omar j

une amélioration dans Halil Özgür code pour supprimer tous les espaces, <br>, <br >, <br class="asdasd">, &nbsp, 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;
}
0
MadsonJr