If you have a text input for a phone number, you may want to validate it as a decimal number. Let me show you why it's a bad idea and what to do instead.
I sometimes see validation rules like this:
return [ 'phone' => "required|numeric|size:11",];
It assumes that the phone number is for one local country and is 11 digits long, with a format like this: 37011122222
. That is a valid number, so numeric
sounds like a good deal?
But it's a good choice only for a few cases.
- What if your project is international and accepts numbers from different countries?
- Even if the project is local, would you not accept a tourist visiting your country, to register with a foreign phone number?
- What if the phone number starts with a "0" digit?
- What if people want to enter their phone numbers in a different format? With dashes, spaces, and other separator symbols? Same number from the example above:
(+370) 111 22222
Ok, I hope I convinced you that numeric
is a bad idea. But what is the correct validation rule, then?
The Solution: Laravel Phone Package
There are multiple solutions, and no single "correct" validation exists. Usually, entering a phone number requires both front-end and back-end solutions, with a designer working on the best user experience for the input field.
But on the back end, I would generally advise using a specific package.
One of the most popular ones is this: Propaganistas/Laravel-Phone
It allows you to have a rule phone
that you can configure separately.
return [ 'phone' => "required|phone", // Or even provide the country/countries: 'mobile_phone' => "required|phone:US,UK",];
If validation fails, you will get a proper error message like "The :attribute field must be a valid phone number."
You can find many more configuration options in the official package documentation.
Ok Sound's Good; however I have tried to install and setup the package but there is one thing missing. How to setup the DB $table->string" decimal" or maybe integer" or what the package does not tell me and I have not found anything on the internet that tells us what to use when setting up this package.
$table->string('phone')->nullable(); $table->decimal('phone')->nullable(); $table->intiger('phone')->nullable(); and how about the mobile number? $table->decimal ('mobile')->nullable(); Exe, Need help Please give me some direction as to which is the best way to go when using this package?
PS I wont to use this in a Filament package Can you give me any guidance on that will this work with Filament I hope!.
This package has https://github.com/Propaganistas/Laravel-Phone?tab=readme-ov-file#database-considerations - which says what types of fields you have to use. It doesn't tell in
migration
terms, but it's pretty clear.Not sure if this works with Filament.