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.