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.

Laravel 4 et Ajax

Dans cet article, voyons comment implémenter une requête Ajax (XHR) avec le framework Laravel.

Implémenter une requête Ajax au sein d’un projet Laravel n’est pas bien compliqué. Dans ce bref exemple, j’ai un tableau de données (non présent dans le billet), un des champs est une icône de statut de l’enregistrement qui peut-être actif ou non, et lorsque l’on clique sur ce bouton, l’état bascule en faisant une requête XHR.

La partie javascript va se trouver dans la vue en question (celle qui affiche le tableau). Lorsque le bouton est cliqué, jQuery.ajax() va déclencher l’exécution de l’action getToggleVisibility() du controlleur courrant, DasboardController dans notre exemple, celui-ci va retourner une réponse JSON qui est utilisée pour intéragir sur la vue. Et le tour est joué.

Continue reading « Laravel 4 et Ajax »