62 votes

Comment valider un numéro de téléphone dans laravel 5.2 ?

Je veux valider le numéro de téléphone saisi par l'utilisateur où le numéro doit être exactement 11 et commencer par 01 et le champ de valeur doit être un numéro uniquement. Comment puis-je le faire en utilisant la validation Laravel ?

Voici mon contrôleur :

  public function saveUser(Request $request){
        $this->validate($request,[
            'name' => 'required|max:120',
            'email' => 'required|email|unique:users',
            'phone' => 'required|min:11|numeric',
            'course_id'=>'required'
            ]);

        $user = new User();
        $user->name=  $request->Input(['name']);
        $user->email=  $request->Input(['email']);
        $user->phone=  $request->Input(['phone']);
        $user->date = date('Y-m-d');
        $user->completed_status = '0';
        $user->course_id=$request->Input(['course_id']);
        $user->save();
       return redirect('success');

    }

0 votes

J'espère que cela aidera votre php - Validation personnalisée des numéros de téléphone dans Laravel 4.2 - Stack Overflow Il est indiqué 4.2 mais cette méthode est également disponible en 5.2.

1 votes

Quel est le problème que vous rencontrez avec ce code ?

0 votes

Si le numéro de téléphone à valider doit toujours "être exactement 11", pourquoi avoir utilisé un champ de saisie pour cela ?

118voto

CmdSft Points 1210

Une solution possible serait d'utiliser des expressions rationnelles.

'phone' => 'required|regex:/(01)[0-9]{9}/'

Cela permettra de vérifier que l'entrée commence par 01 et est suivie de 9 chiffres. En utilisant une expression rationnelle, vous n'avez pas besoin de la balise numeric ou size les règles de validation.

Si vous voulez réutiliser cette méthode de validation ailleurs, il serait bon de créer votre propre règle de validation pour valider les numéros de téléphone.

Docs : Validation personnalisée

Dans votre AppServiceProvider 's boot méthode :

Validator::extend('phone_number', function($attribute, $value, $parameters)
{
    return substr($value, 0, 2) == '01';
});

Cela vous permettra d'utiliser le phone_number règle de validation n'importe où dans votre application, donc la validation de votre formulaire pourrait être :

'phone' => 'required|numeric|phone_number|size:11'

Dans votre extension de validateur, vous pourriez également vérifier si l'élément $value est numérique et comporte 11 caractères.

2 votes

Votre regex n'est pas parfaite. Elle ne correspond pas dès le début et ne vérifie pas la longueur, donc ceci est également valable : ht01123456789123456789 . C'est la regex correcte (en tant que règle de validation) : 'regex:/^(\+36)[0-9]{9}$/' .

2 votes

Si vous écrivez un validateur de numéro de téléphone, il doit valider toutes les exigences auxquelles un numéro de téléphone doit répondre. Il doit également vérifier la longueur et les valeurs numériques. Dans votre solution actuelle, vous devez ajouter d'autres règles partout où vous l'utilisez. Bien que cela fonctionne, ce n'est pas une solution bien organisée. Le validateur n'est pas complet, une fois la validation passée - malgré son nom - il ne dit pas si quelque chose est vraiment un numéro de téléphone, seulement s'il commence par 01 .

1 votes

Ce n'est plus valable. Aux Pays-Bas, des numéros M2M à 12 chiffres ont été introduits.

55voto

vivoconunxino Points 2613

À partir de Laravel 5.5, vous pouvez utiliser une commande artisanale pour créer une nouvelle règle que vous pouvez coder en fonction de vos exigences pour décider si elle est acceptée ou non.

Ej : php artisan make:rule PhoneNumber

Puis modifier app/Rules/PhoneNumber.php sur les passages de méthode

/**
 * Determine if the validation rule passes.
 *
 * @param  string  $attribute
 * @param  mixed  $value
 * @return bool
 */
public function passes($attribute, $value)
{

    return preg_match('%^(?:(?:\(?(?:00|\+)([1-4]\d\d|[1-9]\d?)\)?)?[\-\.\ \\\/]?)?((?:\(?\d{1,}\)?[\-\.\ \\\/]?){0,})(?:[\-\.\ \\\/]?(?:#|ext\.?|extension|x)[\-\.\ \\\/]?(\d+))?$%i', $value) && strlen($value) >= 10;
}

Ensuite, utilisez cette règle comme vous le feriez habituellement avec la validation :

use App\Rules\PhoneNumber;

$request->validate([
    'name' => ['required', new PhoneNumber],
]);

docs

1 votes

C'est la meilleure réponse car 1) elle utilise les dernières fonctionnalités de Laravel 2) elle prend en charge les formats numériques i18n.

1 votes

Cela devrait être la réponse acceptée, car elle suit l'approche la plus récente.

1 votes

Dans le contexte de laravel, cette façon de faire remplace toutes les réponses fournies dans cette question, s'il vous plaît poussez plus haut

31voto

Nady Shalaby Points 181
Validator::extend('phone', function($attribute, $value, $parameters, $validator) {
        return preg_match('%^(?:(?:\(?(?:00|\+)([1-4]\d\d|[1-9]\d?)\)?)?[\-\.\ \\\/]?)?((?:\(?\d{1,}\)?[\-\.\ \\\/]?){0,})(?:[\-\.\ \\\/]?(?:#|ext\.?|extension|x)[\-\.\ \\\/]?(\d+))?$%i', $value) && strlen($value) >= 10;
    });

Validator::replacer('phone', function($message, $attribute, $rule, $parameters) {
        return str_replace(':attribute',$attribute, ':attribute is invalid phone number');
    });

Utilisation

Insérez ce code dans le app/Providers/**AppServiceProvider**.php pour être démarré avec votre application.

Cette règle valide le numéro de téléphone par rapport au modèle donné ci-dessus que j'ai trouvé après
la recherche longue permet de trouver les numéros de téléphone mobile ou de téléphone les plus courants dans de nombreux pays.
Cela vous permettra d'utiliser le phone règle de validation n'importe où dans votre application, donc la validation de votre formulaire pourrait être :

 'phone' => 'required|numeric|phone'

8 votes

Merci ! Pour tous ceux qui ont des problèmes avec cela, assurez-vous d'ajouter use Illuminate\Support\Facades\Validator au sommet de AppServiceProvider

2 votes

Cette réponse devrait être la plus acceptée, car elle est plus complète que celle qui a été choisie. Mais je comprends aussi que le moment où cette réponse a été donnée fait toute la différence.

0 votes

Lorsque le numéro de téléphone n'est pas obligatoire, cette solution continue d'envoyer le message d'erreur "phone is invalid phone number".

11voto

Abhishek Points 2131

Utilisez required|numeric|size:11 Au lieu de required|min:11|numeric

0 votes

Je veux faire une entrée numérique, mais seulement avec 11 chiffres, ni plus ni moins.

1 votes

Dans votre question vous demandez au moins 11 numéros, si vous voulez exactement 11 numéros vous pouvez utiliser required|numeric|size:11 . Pensez à mettre à jour votre question si elle est mal formulée.

0 votes

Oui, @SlateEntropy a raison. Veuillez mettre à jour votre question, je mettrai à jour la réponse.

9voto

aphoe Points 51

Vous pouvez essayer ce paquet de validateurs de téléphone. Téléphone Laravel

Mise à jour

J'ai récemment découvert un autre paquet Lavarel Phone Validator (stuyam/laravel-phone-validator) qui utilise le service gratuit de recherche de téléphone Twilio.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X