2017-10-20 36 views
0

La classe de validation Laravel par défaut permet des emails étranges. Voici les règles de validation que je définis:Problème de validation de l'email de Laravel

return Validation::make($data, [ 
     'email' => 'required|string|email|max:100|unique:customers,email' 
]); 

Lorsque j'ai essayé d'utiliser un e-mail étrange comme: aaaa?#%&'@şğüçi̇ö.com il passe la validation. Cependant, les caractères non latins de l'e-mail sont convertis avant l'insertion de la base de données. L'adresse électronique de la base de données ne correspond donc pas à celle d'origine. Pour éviter cela, je souhaite interdire l'utilisation de caractères non-latins après le symbole @. J'ai essayé la règle personnalisée qui est:

public function passes($attribute, $value) 
{ 
    return filter_var($value, FILTER_VALIDATE_EMAIL) 
    && preg_match('/@.+\./', $value); 
} 

mais cela ne fonctionne pas. Ce serait bien d'avoir de l'aide à ce sujet.

Éditer 1 Nous vous remercions de vos réponses! Mais apparemment, la raison pour laquelle le validateur personnalisé n'agit pas est que Laravel assainit toutes les données d'entrée avant toute manipulation. C'est pourquoi après avoir converti les caractères non latins, preg_replace() renvoie 1 tout le temps car il n'y a pas de caractères non latins sur l'entrée. Tout d'abord, j'ai besoin de trouver une solution à cela et d'empêcher Laravel d'assainir l'entrée.

+0

Qu'en est-il juste 'return filter_var ($ value, FILTER_VALIDATE_EMAIL);' dans la méthode passes? – Maraboc

Répondre

1

De votre question, je comprends que vous avez déjà créé une règle personnalisée et l'utiliser comme la validation

... 
'email' => [ 
    'required', 
    'string', 
    ... 
    new ValidateLatinEmail() 
] 

Comme vous pouvez le voir here, votre RegEx est le problème avec cette validation

Celui-ci devrait fonctionner:

public function passes($attribute, $value) 
{ 
    return filter_var($value, FILTER_VALIDATE_EMAIL) 
     && preg_match('/@[\x00-\x7F]*\./', $value); 
}