2016-04-21 4 views
24

Я хочу проверить номер телефона пользователя, номер которого должен быть ровно 11, и начать с 01, а поле значения должно быть только номером. Как мне это сделать с помощью проверки Laravel?Как проверить номер телефона в laravel 5.2?

Вот мой контроллер:

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

Я надеюсь, что это поможет вашему [php - Custom Validate Phone numbers in Laravel 4.2 - переполнение стека] (http://stackoverflow.com/questions/29259366/custom-validate-phone-numbers-in -laravel-4-2? answertab = votes # tab-top) Это говорят 4.2, но этот метод также доступен в 5.2 – Devsome

+0

В чем проблема с этим кодом? – Abhishek

ответ

35

Одно из возможных решений будет использовать регулярное выражение.

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

Это проверит ввод с 01, за которым последуют 9 цифр. При использовании регулярного выражения вам не нужны правила проверки numeric или size.

Если вы хотите повторно использовать этот метод проверки else, где было бы неплохо создать собственное правило проверки правильности номеров телефонов.

Docs: Custom Validation

В ваших AppServiceProvider «ы boot метод:

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

Это позволит использовать правила в phone_number проверки в любом месте вашего приложения, так что ваша форма проверки может быть:

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

В вашем расширителе валидатора вы также можете проверить, есть ли $value nume ric и 11 символов.

+0

Ваше регулярное выражение не идеально. Он не совпадает с началом и не проверяет длину, поэтому это также верно: 'ht01123456789123456789'. Это правильное регулярное выражение (как правило проверки): '' regex:/^ (\ + 36) [0-9] {9} $/''. – totymedli

+0

Если вы пишете валидатор номера телефона, он должен подтвердить каждое требование, которое должен выполнить номер телефона. Он также должен проверять длину и числовые значения. В вашем текущем решении вам нужно добавить другие правила везде, где вы его используете. Хотя это работает, это не хорошо организованное решение. Валидатор не является полным, после того, как проверка прошла - несмотря на его имя - он не говорит, действительно ли что-то действительно является номером телефона, только то, что оно начинается с '01'. – totymedli

+0

Актуально. В Нидерландах были введены номера M2M длиной 12 цифр. – FrozenDroid

8

Использование required|numeric|size:11 Вместо required|min:11|numeric

+0

Я хочу сделать только числовой ввод, но только с 11 цифрами! не менее или больше, чем на самом деле – User57

+1

В вашем вопросе вы запрашиваете не менее 11 номеров, если вы хотите ровно 11 номеров, вы можете использовать 'required | numeric | size: 11'. Подумайте, обновите свой вопрос, если он сформулирован неправильно. – SlateEntropy

+0

Да @SlateEntropy верна. Пожалуйста, обновите свой вопрос, я обновлю ответ. – Abhishek

9
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'); 
    }); 

Использование

Вставьте этот код в AppServiceProfider быть загружен с приложением.

этого правило проверяет номер телефона против данного рисунка выше, что я нашел после
долгих поисков он соответствует наиболее распространенным мобильным или телефонным номерам во многих странах
Это позволит использовать правила в phone проверки в любом месте вашей заявки, поэтому ваша форма проверки может быть:

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

+2

Спасибо! Для тех, у кого есть проблемы с этим, не забудьте добавить 'use Illuminate \ Support \ Facades \ Validator' в начало' AppServiceProvider' – fronzee

+1

Это должен быть более приемлемый ответ, поскольку он более тщательный, чем тот, который был выбран. И снова я понимаю, что время, в которое был дан этот ответ, имеет значение. –

+0

, когда номер телефона не является обязательным, это решение продолжает выдавать сообщение об ошибке «телефон недействительный номер телефона» –

6

Вы можете попробовать этот пакет проверки подлинности телефона. Laravel Phone

0

При проверке номера телефона необходимо учитывать много вещей, если вы действительно думаете об этом. (особенно международные), поэтому использование пакета лучше, чем принятый ответ, и если вы хотите что-то простое, как регулярное выражение, я бы предложил использовать что-то лучше, чем предлагал @SlateEntropy. (что-то вроде A comprehensive regex for phone number validation)

Смежные вопросы