Laravel : ignorer une règle de validation unique lors d’un update

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.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *