ユーザー入力の電話番号を検証します。番号は正確に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');
}
考えられる解決策の1つは、正規表現を使用することです。
'phone' => 'required|regex:/(01)[0-9]{9}/'
これは、入力が01で始まり、9つの数字が続くことを確認します。正規表現を使用すると、numeric
またはsize
の検証規則は必要ありません。
この検証方法を他の場所で再利用する場合は、電話番号を検証するための独自の検証ルールを作成することをお勧めします。
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
が数字で11文字の長さであるかどうかも確認できます。
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');
});
使用法
このコードをapp/Providers/AppServiceProvider.php
に挿入して、アプリケーションで起動します。
このルールは、上記の特定のパターンに対して電話番号を検証します。
ロングサーチは、多くの国で最も一般的な携帯電話または電話番号に一致します
これにより、アプリケーションの任意の場所でphone
検証ルールを使用できるようになるため、フォーム検証は次のようになります。
'phone' => 'required | numeric | 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]\d\d|[1-9]\d?)\)?)?[\-\.\ \\\/]?)?((?:\(?\d{1,}\)?[\-\.\ \\\/]?){0,})(?:[\-\.\ \\\/]?(?:#|ext\.?|extension|x)[\-\.\ \\\/]?(\d+))?$%i', $value) && strlen($value) >= 10;
}
次に、通常の検証で行うように、このルールを使用します。
use App\Rules\PhoneNumber;
$request->validate([
'name' => ['required', new PhoneNumber],
]);
required|numeric|size:11
の代わりにrequired|min:11|numeric
を使用します
この電話検証パッケージを試すことができます。 Laravel Phone
更新
私は最近別のパッケージを発見しました Lavarel Phone Validator(stuyam/laravel-phone-validator) 、これは無料のTwilio電話検索サービスを使用します
あなたは簡単に使用できます:
'mobile_number' => ['required', 'digits:10'],
電話番号を本当に考えている場合は、電話番号を検証するときに考慮すべきことがたくさんあります。 (特に国際的な)パッケージを使用することは、受け入れられている答えよりもはるかに優れています。正規表現のような単純なものが必要な場合は、@ SlateEntropyが提案したものよりも優れたものを使用することをお勧めします。 ( 電話番号検証の包括的な正規表現 )