20steps / phone-number-bundle
Integrates libphonenumber into your Symfony2 application
Installs: 68
Dependents: 0
Suggesters: 0
Security: 0
Stars: 0
Watchers: 5
Forks: 143
Type:symfony-bundle
Requires
- php: >=5.3.3
- giggsey/libphonenumber-for-php: ~5.7|~6.0|~7.0|~8.0
- symfony/framework-bundle: ~2.1|~3.0
Requires (Dev)
- doctrine/doctrine-bundle: ~1.0
- jms/serializer-bundle: ~0.11|~1.0
- phpunit/phpunit: ~4.0
- symfony/form: ~2.3|~3.0
- symfony/serializer: ~2.7|~3.1
- symfony/templating: ~2.1|~3.0
- symfony/twig-bundle: ~2.1|~3.0
- symfony/validator: ~2.1|~3.0
Suggests
- doctrine/doctrine-bundle: Add a DBAL mapping type
- jms/serializer-bundle: Serialize/deserialize phone numbers using JSM library
- symfony/form: Add a data transformer
- symfony/serializer: Serialize/deserialize phone numbers using Symfony library
- symfony/templating: Format phone numbers in templates
- symfony/twig-bundle: Format phone numbers in Twig templates
- symfony/validator: Add a validation constraint
Conflicts
- twig/twig: <1.12.0
README
This bundle integrates Google's libphonenumber into your Symfony2/Symfony3 application through the giggsey/libphonenumber-for-php port.
Installation
-
Use Composer to download the PhoneNumberBundle:
$ composer require misd/phone-number-bundle
-
Register the bundle in your application:
// app/AppKernel.php public function registerBundles() { $bundles = array( // ... new Misd\PhoneNumberBundle\MisdPhoneNumberBundle() ); }
Usage
Services
The following services are available:
So to parse a string into a libphonenumber\PhoneNumber
object:
$phoneNumber = $container->get('libphonenumber.phone_number_util')->parse($string, PhoneNumberUtil::UNKNOWN_REGION);
Doctrine mapping
Requires doctrine/doctrine-bundle
.
To persist libphonenumber\PhoneNumber
objects, add the Misd\PhoneNumberBundle\Doctrine\DBAL\Types\PhoneNumberType
mapping to your application's config:
// app/config.yml
doctrine:
dbal:
types:
phone_number: Misd\PhoneNumberBundle\Doctrine\DBAL\Types\PhoneNumberType
You can then use the phone_number
mapping:
/**
* @ORM\Column(type="phone_number")
*/
private $phoneNumber;
This creates a varchar(35)
column with a Doctrine mapping comment.
Note that if you're putting the phone_number
type on an already-existing schema the current values must be converted to the libphonenumber\PhoneNumberFormat::E164
format.
Formatting libphonenumber\PhoneNumber
objects
Twig
The phone_number_format
filter can be used to format a phone number object. A libphonenumber\PhoneNumberFormat
constant can be passed as argument to specify in which format the number should be printed.
For example, to format an object called myPhoneNumber
in the libphonenumber\PhoneNumberFormat::NATIONAL
format:
{{ myPhoneNumber|phone_number_format('NATIONAL') }}
By default phone numbers are formatted in the libphonenumber\PhoneNumberFormat::INTERNATIONAL
format.
PHP template
The format()
method in the phone_number_format
helper takes two arguments: a libphonenumber\PhoneNumber
object and an optional libphonenumber\PhoneNumberFormat
constant name or value.
For example, to format $myPhoneNumber
in the libphonenumber\PhoneNumberFormat::NATIONAL
format, either use:
<?php echo $view['phone_number_format']->format($myPhoneNumber, 'NATIONAL') ?>
or:
<?php echo $view['phone_number_format']->format($myPhoneNumber, \libphonenumber\PhoneNumberFormat::NATIONAL) ?>
By default phone numbers are formatted in the libphonenumber\PhoneNumberFormat::INTERNATIONAL
format.
Serializing libphonenumber\PhoneNumber
objects
Requires jms/serializer-bundle
.
Instances of libphonenumber\PhoneNumber
are automatically serialized in the E.164 format.
Phone numbers can be deserialized from an international format by setting the type to libphonenumber\PhoneNumber
. For example:
use JMS\Serializer\Annotation\Type;
/**
* @Type("libphonenumber\PhoneNumber")
*/
private $phoneNumber;
Using libphonenumber\PhoneNumber
objects in forms
You can use the PhoneNumberType
(tel
for Symfony <= 2.7) form type to create phone number fields. There are two widgets available.
Single text field
A single text field allows the user to type in the complete phone number. When an international prefix is not entered, the number is assumed to be part of the set default_region
. For example:
use libphonenumber\PhoneNumberFormat;
use Misd\PhoneNumberBundle\Form\Type\PhoneNumberType;
use Symfony\Component\Form\FormBuilderInterface;
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('phone_number', PhoneNumberType::class, array('default_region' => 'GB', 'format' => PhoneNumberFormat::NATIONAL));
}
By default the default_region
and format
options are PhoneNumberUtil::UNKNOWN_REGION
and PhoneNumberFormat::INTERNATIONAL
respectively.
Country choice fields
The phone number can be split into a country choice and phone number text fields. This allows the user to choose the relevant country (from a customisable list) and type in the phone number without international dialling.
use libphonenumber\PhoneNumberFormat;
use Misd\PhoneNumberBundle\Form\Type\PhoneNumberType;
use Symfony\Component\Form\FormBuilderInterface;
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('phone_number', PhoneNumberType::class, array('widget' => PhoneNumberType::WIDGET_COUNTRY_CHOICE, 'country_choices' => array('GB', 'JE', 'FR', 'US'), 'preferred_country_choices' => array('GB', 'JE')));
}
This produces the preferred choices of 'Jersey' and 'United Kingdom', and regular choices of 'France' and 'United States'.
By default the country_choices
is empty, which means all countries are included, as is preferred_country_choices
.
Validating phone numbers
You can use the Misd\PhoneNumberBundle\Validator\Constraints\PhoneNumber
constraint to make sure that either a libphonenumber\PhoneNumber
object or a plain string is a valid phone number. For example:
use Misd\PhoneNumberBundle\Validator\Constraints\PhoneNumber as AssertPhoneNumber;
/**
* @AssertPhoneNumber
*/
private $phoneNumber;
You can set the default region through the defaultRegion
property:
use Misd\PhoneNumberBundle\Validator\Constraints\PhoneNumber as AssertPhoneNumber;
/**
* @AssertPhoneNumber(defaultRegion="GB")
*/
private $phoneNumber;
By default any valid phone number will be accepted. You can restrict the type through the type
property, recognised values:
Misd\PhoneNumberBundle\Validator\Constraints\PhoneNumber::ANY
(default)Misd\PhoneNumberBundle\Validator\Constraints\PhoneNumber::FIXED_LINE
Misd\PhoneNumberBundle\Validator\Constraints\PhoneNumber::MOBILE
Misd\PhoneNumberBundle\Validator\Constraints\PhoneNumber::PAGER
Misd\PhoneNumberBundle\Validator\Constraints\PhoneNumber::PERSONAL_NUMBER
Misd\PhoneNumberBundle\Validator\Constraints\PhoneNumber::PREMIUM_RATE
Misd\PhoneNumberBundle\Validator\Constraints\PhoneNumber::SHARED_COST
Misd\PhoneNumberBundle\Validator\Constraints\PhoneNumber::TOLL_FREE
Misd\PhoneNumberBundle\Validator\Constraints\PhoneNumber::UAN
Misd\PhoneNumberBundle\Validator\Constraints\PhoneNumber::VOIP
Misd\PhoneNumberBundle\Validator\Constraints\PhoneNumber::VOICEMAIL
(Note that libphonenumber cannot always distinguish between mobile and fixed-line numbers (eg in the USA), in which case it will be accepted.)
/**
* @AssertPhoneNumber(type="mobile")
*/
private $mobilePhoneNumber;
Translations
The bundle contains translations for the form field and validation constraints.
In cases where a language uses multiple terms for mobile phones, the generic language locale will use the term 'mobile', while country-specific locales will use the relevant term. So in English, for example, en
uses 'mobile', en_US
uses 'cell' and en_SG
uses 'handphone'.
If your language doesn't yet have translations, feel free to open a pull request to add them in!