giggsey/libphonenumber-for-php-lite
Lite PHP port of Google’s libphonenumber: parse, validate, format, and store international phone numbers. Includes core PhoneNumberUtils only (no geolocation/carrier/short number info). Requires PHP 8.1+ and mbstring; install via Composer.
Installation:
composer require giggsey/libphonenumber-for-php-lite
Ensure mbstring extension is enabled in your PHP environment.
First Use Case: Parse and validate a phone number:
use libphonenumber\PhoneNumberUtil;
$phoneUtil = PhoneNumberUtil::getInstance();
$number = $phoneUtil->parse('+14155552671', 'US');
$isValid = $phoneUtil->isValidNumber($number); // true
Where to Look First:
Parsing and Validation:
$phoneUtil = PhoneNumberUtil::getInstance();
$number = $phoneUtil->parse($rawInput, $regionCode); // e.g., '1234567890', 'US'
$isValid = $phoneUtil->isValidNumber($number);
Formatting:
// E164: "+14155552671"
$e164 = $phoneUtil->format($number, PhoneNumberFormat::E164);
// National: "(415) 555-2671"
$national = $phoneUtil->format($number, PhoneNumberFormat::NATIONAL);
// International: "+1 415-555-2671"
$international = $phoneUtil->format($number, PhoneNumberFormat::INTERNATIONAL);
Geographic Formatting:
// Format for dialing from another country (e.g., UK)
$ukDialFormat = $phoneUtil->formatOutOfCountryCallingNumber($number, 'GB');
Number Type Detection:
$numberType = $phoneUtil->getNumberType($number); // e.g., PhoneNumberType::MOBILE
Number Comparison:
$isMatch = $phoneUtil->isNumberMatch($number1, $number2); // Returns confidence level
Laravel Request Validation: Use the package in Form Requests or API validations:
use libphonenumber\PhoneNumberUtil;
public function rules()
{
return [
'phone' => ['required', function ($attribute, $value, $fail) {
$phoneUtil = PhoneNumberUtil::getInstance();
try {
$number = $phoneUtil->parse($value);
if (!$phoneUtil->isValidNumber($number)) {
$fail('The phone number is invalid.');
}
} catch (\libphonenumber\NumberParseException $e) {
$fail('The phone number is invalid.');
}
}],
];
}
Database Storage: Store normalized E164 format to avoid inconsistencies:
$e164 = $phoneUtil->format($number, PhoneNumberFormat::E164);
$user->phone = $e164;
User Input Handling:
Use parse() without a region code for flexible parsing:
$number = $phoneUtil->parse($userInput); // Auto-detects region if possible
Caching:
Cache the PhoneNumberUtil instance for performance:
$phoneUtil = Cache::remember('phoneUtil', now()->addDays(30), function () {
return PhoneNumberUtil::getInstance();
});
Region Code Ambiguity:
parse('12345')) may return unexpected results. Always specify a region if possible.'12345' could be valid in some countries but invalid in others.Invalid Input Handling:
parse() in a try-catch block to handle NumberParseException:
try {
$number = $phoneUtil->parse($invalidInput);
} catch (\libphonenumber\NumberParseException $e) {
// Handle invalid input (e.g., log or return user-friendly error)
}
Metadata Updates:
Performance:
Short Numbers:
libphonenumber-for-php package for those features.Inspect Parsed Numbers:
Use var_dump() or json_encode() to debug PhoneNumber objects:
$number = $phoneUtil->parse('+442071838750', 'GB');
echo json_encode($number, JSON_PRETTY_PRINT);
Check Region Codes:
Use getSupportedRegions() to list valid region codes:
$regions = $phoneUtil->getSupportedRegions();
Example Numbers: Generate valid examples for testing:
$example = $phoneUtil->getExampleNumber('US'); // e.g., "+16502530000"
$mobileExample = $phoneUtil->getExampleNumberByType('US', PhoneNumberType::MOBILE);
Custom Validation Logic: Extend validation by combining with Laravel's validation rules:
$validator = Validator::make($data, [
'phone' => ['required', 'phone:US'], // Custom rule for US numbers
]);
Service Provider:
Bind the PhoneNumberUtil instance in Laravel's service container for dependency injection:
// app/Providers/AppServiceProvider.php
public function register()
{
$this->app->singleton(\libphonenumber\PhoneNumberUtil::class, function () {
return \libphonenumber\PhoneNumberUtil::getInstance();
});
}
Testing: Use the package in PHPUnit tests to validate phone numbers:
public function testValidPhoneNumber()
{
$phoneUtil = PhoneNumberUtil::getInstance();
$number = $phoneUtil->parse('+14155552671', 'US');
$this->assertTrue($phoneUtil->isValidNumber($number));
}
Localization: Format numbers according to user preferences (e.g., store preferred format in the database):
$format = $user->preferredPhoneFormat ?? PhoneNumberFormat::NATIONAL;
$formatted = $phoneUtil->format($number, $format);
Time Zone Handling: The library does not handle time zones. If you need to associate phone numbers with time zones (e.g., for SMS delivery), implement this logic separately.
Legacy Data:
If migrating from an older version (e.g., v8), ensure serialized data is compatible. The package includes fixes for backward compatibility (e.g., unserialize() support).
How can I help you explore Laravel packages today?