giggsey/libphonenumber-for-php-lite
Lite PHP port of Google’s libphonenumber for parsing, formatting, storing, and validating international phone numbers. Includes core PhoneNumberUtils only (no geolocation/carrier/short numbers). Requires PHP 8.1+ and mbstring; install via Composer.
bind()) and Validation Rules (custom rules for phone number validation). Can integrate with Laravel Notifications for SMS-based workflows.mbstring). Composer-based installation aligns with Laravel’s dependency management.composer.json.User models) or post-storage (e.g., via Laravel Observers).libphonenumber data lags (e.g., new country codes). Mitigate via:
PhoneNumberUtil::getInstance() is a singleton).PhoneNumberUtil::isValidNumberForRegion().E164 if formatting fails.PhoneNumberToCarrierMapper) needed, or is the lite version sufficient?users table, separate phone_numbers table?)PhoneNumberUtil, ShortNumberInfo) to the container for dependency injection.
// app/Providers/AppServiceProvider.php
public function register()
{
$this->app->singleton(\libphonenumber\PhoneNumberUtil::class, fn() =>
\libphonenumber\PhoneNumberUtil::getInstance()
);
}
// app/Rules/ValidPhoneNumber.php
use libphonenumber\PhoneNumberUtil;
use libphonenumber\NumberParseException;
class ValidPhoneNumber implements Rule
{
public function passes($attribute, $value)
{
$phoneUtil = app(PhoneNumberUtil::class);
try {
$number = $phoneUtil->parse($value, $this->region);
return $phoneUtil->isValidNumber($number);
} catch (NumberParseException) {
return false;
}
}
}
// app/Observers/PhoneNumberObserver.php
public function saving(User $user)
{
if ($user->phone && !$user->e164_phone) {
$phoneUtil = app(PhoneNumberUtil::class);
$number = $phoneUtil->parse($user->phone, $user->country_code);
$user->e164_phone = $phoneUtil->format($number, PhoneNumberFormat::E164);
}
}
FormRequest classes or middleware.// app/Jobs/ValidatePhoneNumbers.php
public function handle()
{
$users = User::whereNull('e164_phone')->limit(100)->get();
foreach ($users as $user) {
$phoneUtil = app(PhoneNumberUtil::class);
$number = $phoneUtil->parse($user->phone, $user->country_code);
$user->update(['e164_phone' => $phoneUtil->format($number, PhoneNumberFormat::E164)]);
}
}
libphonenumber-for-php-lite.e164_phone column to users table for normalized storage.libphonenumber-for-php).E164 format for search consistency.E164 format for API calls.| Step | Task | Dependencies | Owner |
|---|---|---|---|
| 1 | Install package | Composer access | DevOps |
| 2 | Create validation rules | Package installed | Backend |
| 3 | Add validation to forms | Rules created | Frontend/Backend |
| 4 | Backfill existing data | Validation working | Backend |
| 5 | Add normalization observers | Backfill complete | Backend |
| 6 | Test edge cases | Normalization in place | QA |
| 7 | Optimize (cache, queues) | High-traffic paths identified | Backend |
libphonenumber releases for metadata changes.update command with --dry-run to test updates.README.PHONE_VALIDATION.md to the project wiki.How can I help you explore Laravel packages today?