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.
libphonenumber ensures industry-standard compliance.+14155552671), ideal for database storage and deduplication.+44 20 7946 0958 for UK numbers), useful for multi-country applications.NATIONAL vs. INTERNATIONAL formats).creating/updating model events (e.g., User model).ApiResource transformers.9.0.30 updates for CL, CZ).getNumberType() for additional context.Validation Strictness:
isValidNumber() returns false), or allow partial validation (e.g., parse() with fallback defaults)?123 (invalid) vs. 123-456-7890 (valid).Formatting Strategy:
E164 (storage-friendly) or NATIONAL (user-friendly)? Context-dependent (e.g., APIs vs. UI).Fallback Behavior:
XX country code)? Options:
+XX12345678).Performance at Scale:
PhoneNumberUtil instance.Compliance:
Laravel Ecosystem:
app/Rules/ValidPhoneNumber) leveraging isValidNumber().
use libphonenumber\PhoneNumberUtil;
use libphonenumber\PhoneNumberFormat;
class ValidPhoneNumber implements Rule {
public function passes($attribute, $value) {
$phoneUtil = PhoneNumberUtil::getInstance();
try {
$number = $phoneUtil->parse($value, null);
return $phoneUtil->isValidNumber($number);
} catch (\libphonenumber\NumberParseException) {
return false;
}
}
}
// User.php
protected $casts = ['phone_number' => 'string'];
public function setPhoneNumberAttribute($value) {
$this->attributes['phone_number'] = $this->normalizePhone($value);
}
private function normalizePhone($phone) {
$phoneUtil = PhoneNumberUtil::getInstance();
$number = $phoneUtil->parse($phone, null);
return $phoneUtil->format($number, PhoneNumberFormat::E164);
}
Accept-Language header.
// FormatPhoneNumberMiddleware.php
public function handle($request, Closure $next) {
$response = $next($request);
if ($response->getContentType() === 'application/json') {
$data = json_decode($response->getContent(), true);
$this->formatPhoneNumbers($data);
$response->setContent(json_encode($data));
}
return $response;
}
Queue Workers:
Phase 1: Validation Layer
Phase 2: Data Normalization
// Migration: Update phone numbers to E.164
public function up() {
DB::table('users')->chunk(1000, function ($users) {
foreach ($users as $user) {
$normalized = $this->normalizePhone($user->phone_number);
DB::table('users')->where('id', $user->id)->update(['phone_number' => $normalized]);
}
});
}
Phase 3: API/UI Formatting
NATIONAL for local display).giggsey/libphonenumber-for-php (supports PHP 7.4+).php.ini.laravel/framework, spatie/laravel-permission).update or require with ^9.0 for minor/patch updates.9.x → 10.x) may require testing due to metadata changes.composer.json to avoid surprises:
"giggsey/libphonenumber-for-php-lite": "^9.0"
How can I help you explore Laravel packages today?