ad3n/phone-number-bundle
Symfony bundle integrating Google libphonenumber (via giggsey/libphonenumber-for-php). Provides services for parsing, validating, formatting, geocoding, carrier and timezone mapping, plus short number info, for Symfony 2–4 apps.
composer require misd/phone-number-bundle
config/bundles.php:
return [
// ...
Misd\PhoneNumberBundle\MisdPhoneNumberBundle::class => ['all' => true],
];
use Misd\PhoneNumberBundle\PhoneNumber\PhoneNumber;
use Misd\PhoneNumberBundle\PhoneNumber\PhoneNumberUtil;
public function validatePhone(Request $request)
{
$phoneUtil = new PhoneNumberUtil();
$phoneNumber = $phoneUtil->parse('+14155552671', 'US');
if (!$phoneUtil->isValidNumber($phoneNumber)) {
return new Response('Invalid number');
}
$formatted = $phoneUtil->format($phoneNumber, PhoneNumber::E164);
return new Response($formatted);
}
PhoneNumberUtil: Core class for parsing, validating, and formatting.PhoneNumber: Represents a parsed phone number object.phone_number Twig filter.Form Validation:
use Symfony\Component\Validator\Constraints as Assert;
use Misd\PhoneNumberBundle\Validator\Constraints\ValidPhoneNumber;
$builder->add('phone', TextType::class, [
'constraints' => [
new Assert\NotBlank(),
new ValidPhoneNumber(['countryCode' => 'US']),
],
]);
Internationalization:
$phoneUtil = new PhoneNumberUtil();
$number = $phoneUtil->parse('02079460000', 'GB');
$formatted = $phoneUtil->format($number, PhoneNumber::NATIONAL);
Twig Integration:
{{ user.phone|phone_number('international') }}
Geocoding:
$regionCode = $phoneUtil->getRegionCodeForNumber($phoneNumber);
$timeZones = $phoneUtil->getSupportedRegions();
PhoneNumberUtil as a service in services.yaml:
services:
App\Service\PhoneService:
arguments:
$phoneUtil: '@misd_phone_number.phone_number_util'
public function onUserUpdate(UserEvent $event)
{
$phoneUtil = $this->phoneUtil;
$number = $phoneUtil->parse($event->getUser()->getPhone());
$event->getUser()->setPhone($phoneUtil->format($number, PhoneNumber::E164));
}
Performance:
PhoneNumberUtil:
services:
misd_phone_number.phone_number_util:
synthetic: true
PhoneNumberUtil per request if possible.Region Ambiguity:
+44 (UK) or +1 (US/Canada) may require manual region specification:
$phoneUtil->parse('441234567890', null); // Ambiguous; specify 'GB' or 'US'.
Deprecated Methods:
PhoneNumberUtil::parse() over PhoneNumberUtil::parseAndKeepRawInput() unless you need raw input preservation.Symfony 5+:
autowiring: true in config/services.yaml for seamless DI.Invalid Numbers:
Use PhoneNumberUtil::isValidNumber() and check PhoneNumberUtil::getErrorMessage():
try {
$phoneNumber = $phoneUtil->parse('invalid', 'US');
} catch (\giggsey\LibPhonenumber\NumberParseException $e) {
return new Response($e->getMessage());
}
Time Zone Issues:
If geocoding fails, verify PhoneNumberUtil::getSupportedRegions() includes the expected country code.
Custom Validators:
Extend ValidPhoneNumber constraint for business rules:
class CustomValidPhoneNumber extends ValidPhoneNumber
{
protected function getOptions()
{
return array_merge(parent::getOptions(), ['allowShortNumbers' => false]);
}
}
Override Default Formatter: Create a custom formatter service:
services:
app.phone_formatter:
class: App\Service\CustomPhoneFormatter
arguments:
$phoneUtil: '@misd_phone_number.phone_number_util'
Add New Regions: Dynamically load regions at runtime:
$phoneUtil->setRegionCodeForNumberOverride('+1', 'CA'); // Override US default.
Default Country:
Set a default country in config/packages/misd_phone_number.yaml:
misd_phone_number:
default_country: 'US'
This affects validation when no region is specified.
Strict Mode: Enable strict parsing (throws exceptions for invalid numbers):
misd_phone_number:
strict: true
How can I help you explore Laravel packages today?