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

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

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

    }

6 ответов


одним из возможных решений было бы использование regex.

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

это проверит, что вход начинается с 01 и сопровождается 9 номерами. Используя regex, вам не нужно numeric или size правила проверки.

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

Docs: Пользовательская Проверка

в своем AppServiceProvider ‘ s 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 числовой и 11 символов.


Validator::extend('phone', function($attribute, $value, $parameters, $validator) {
        return preg_match('%^(?:(?:(?(?:00|+)([1-4]dd|[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' 

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


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


из Laravel 5.5 вы можете использовать команду artisan для создания нового правила, которое вы можете закодировать в отношении ваших требований, чтобы решить, проходит ли оно или нет.

Ej:
php artisan make:rule PhoneNumber

затем измените app/Rules/PhoneNumber.php, по методу проходит

/**
 * 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]dd|[1-9]d?))?)?[-. /]?)?((?:(?d{1,})?[-. /]?){0,})(?:[-. /]?(?:#|ext.?|extension|x)[-. /]?(d+))?$%i', $value) && strlen($value) >= 10;
}

затем используйте это правило, как вы обычно делали бы с проверкой:

use AppRulesPhoneNumber;

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

docs


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