Un petit point de base manquant dans les règles de validation d’un formulaire du framework Laravel est le cas où on veut ignorer un champ unique lors d’une mise-à-jour. Je m’explique. Prenons le début d’une classe modèle de gestion d’utilisateurs avec les règles de validation dans un attribut statique comme suit :
class User extends Eloquent { public static $rules = array( 'name' => 'required|alpha|min:2', 'username' => 'required|alpha|min:2', 'email' => 'required|email|unique:users,email', 'password' => 'required|alpha_num|between:6,12|confirmed', 'password_confirmation' => 'required|alpha_num|between:6,12' ); // ...
On voit que l’email doit être unique, pas de problème lors de l’ajout, mais lorsque l’on met à jour un utilisateur, cette règle nous bloque, car l’email doit être unique. Il existe un moyen d’ignorer un certain ID en l’ajoutant à la fin, comme ceci 'required|email|unique:users,email,10'
, mais il est difficile d’ajouter cet ID dynamiquement dans le modèle sans ajouter du bruit à notre code. Une solution consiste à laisser le modèle en l’état, mais de hacker cet élément du tableau de règle depuis la méthode d’update du controlleur :
public function postUpdate($id) { $user = User::find($id); // On récupère les règles $userrules = User::$rules; // On met à jour la règle pour le champ email avec l'ID courant $userrules['email'] = 'required|email|unique:users,email,' . $id; // Validation des champs $validator = Validator::make(Input::all(), $userrules); if ($validator->passes()) { // ...
Il semble un peu bizarre que ce mécanisme ne soit pas pris en compte par défaut dans Laravel, en espèrant qu’il le soit dans une prochaine version.