web-dev-qa-db-fra.com

Comment valider le courrier électronique unique de l'utilisateur qui le met à jour dans Laravel?

J'utilise Laravel 5.2 et souhaite mettre à jour le compte de l'utilisateur à l'aide du validateur.

Je veux que le champ de courrier électronique reste unique, mais si l'utilisateur tape son courrier électronique actuel, il sera rompu. Comment puis-je mettre à jour si l'e-mail est unique, à l'exception de l'e-mail actuel de l'utilisateur?

14
Luiz

Vous pouvez dire cela aux validateurs:

'email' => 'unique:users,email_address,'.$user->id

Vérifiez les docs de la section 'Forcer une règle unique à ignorer un identifiant donné'.

34

Dans Request Class, vous aurez probablement besoin de cette validation dans la méthode PUT ou PATCH sans utilisateur, vous pouvez simplement utiliser cette règle.

 You have 2 options to do this

1:

 'email' => "unique:users,email,$this->id,id"

OU 

2:

 use Illuminate\Validation\Rule; //import Rule class 
'email' => Rule::unique('users')->ignore($this->id); //use it in PUT or PATCH method

$ this-> id fournit l'identifiant de l'utilisateur car $ this est un objet de Request Class et Request contient également un objet utilisateur.

public function rules()
{
    switch ($this->method()) {
        case 'POST':
        {
            return [
                'name' => 'required',
                'email' => 'required|email|unique:users',
                'password' => 'required'
            ];
        }
        case 'PUT':
        case 'PATCH':
        {
            return [
                'name' => 'required',
                'email' => "unique:users,email,$this->id,id",
                                   OR
                //below way will only work in Laravel ^5.5 
                'email' => Rule::unique('users')->ignore($this->id),

               //Sometimes you dont have id in $this object
               //then you can use route method to get object of model 
               //and then get the id or slug whatever you want like below:

              'email' => Rule::unique('users')->ignore($this->route()->user->id),
            ];
        }
        default: break;
    }
}

J'espère que cela résoudra le problème en utilisant la classe de requêtes.

9
Afraz Ahmad

Sur Laravel 5.7 pour demander au validateur d'ignorer l'ID de l'utilisateur, nous utiliserons la classe Rule pour définir la règle de manière fluide. Dans cet exemple, nous allons également spécifier les règles de validation sous forme de tableau au lieu d'utiliser | caractère pour délimiter les règles:

use Illuminate\Validation\Rule;

Validator::make($data, [
    'email' => [
        'required',
        Rule::unique('users')->ignore($user->id),
    ],
]);
0
Juan Carlos Ibarra

Pour les codeurs utilisant FormRequest & Laravel 5.7 et confrontés à ce problème, vous pouvez faire quelque chose comme ceci

public function rules() {

    return [
        'email' => ['required', 'string', 'email', 'max:255',
            Rule::unique('users')->ignore($this->user),
        ],
    ];

}

Le $this->user renverra l'ID utilisateur provenant de la demande.

0
Salam