ad3n / phone-number-bundle
将libphonenumber集成到您的Symfony2-Symfony4应用程序中
Requires
- php: >=7.2
- giggsey/libphonenumber-for-php: ~8.0
- symfony/framework-bundle: ~5.0
Requires (Dev)
- doctrine/doctrine-bundle: ~2.1
- jms/serializer-bundle: ~3.0
- phpunit/phpunit: ~6.5|~7.0
- symfony/form: ~5.0
- symfony/serializer: ~2.7|~3.1|~4.0|~5.0
- symfony/templating: ~5.0
- symfony/twig-bundle: ~5.0
- symfony/validator: ~5.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
README
此包通过giggsey/libphonenumber-for-php端口将Google的libphonenumber集成到您的Symfony2-Symfony4应用程序中。
安装
- 使用Composer下载PhoneNumberBundle
$ composer require misd/phone-number-bundle
- 在您的应用程序中注册此包
// app/AppKernel.php public function registerBundles() { $bundles = array( // ... new Misd\PhoneNumberBundle\MisdPhoneNumberBundle() ); }
使用方法
服务
以下服务可用
要将字符串解析为libphonenumber\PhoneNumber
对象
$phoneNumber = $container->get('libphonenumber.phone_number_util')->parse($string, PhoneNumberUtil::UNKNOWN_REGION);
Doctrine映射
需要doctrine/doctrine-bundle
。
要持久化libphonenumber\PhoneNumber
对象,请将Misd\PhoneNumberBundle\Doctrine\DBAL\Types\PhoneNumberType
映射添加到您的应用程序配置中
// app/config.yml doctrine: dbal: types: phone_number: Misd\PhoneNumberBundle\Doctrine\DBAL\Types\PhoneNumberType
然后您可以使用phone_number
映射
/** * @ORM\Column(type="phone_number") */ private $phoneNumber;
这创建了一个具有Doctrine映射注释的varchar(35)
列。
请注意,如果将phone_number
类型应用于已存在的模式,则当前值必须转换为libphonenumber\PhoneNumberFormat::E164
格式。
模板化
Twig
phone_number_format
可以使用phone_number_format
过滤器来格式化电话号码对象。可以通过传递libphonenumber\PhoneNumberFormat
常量作为参数来指定打印数字的格式。
例如,要将名为myPhoneNumber
的对象格式化为libphonenumber\PhoneNumberFormat::NATIONAL
格式
{{ myPhoneNumber|phone_number_format('NATIONAL') }}
默认情况下,电话号码以libphonenumber\PhoneNumberFormat::INTERNATIONAL
格式格式化。
phone_number_of_type
可以使用phone_number_of_type
测试来检查电话号码是否与指定类型匹配:必须传递libphonenumber\PhoneNumberType
常量名称来指定号码必须匹配的类型。
例如,要检查名为myPhoneNumber
的对象是否为libphonenumber\PhoneNumberType::MOBILE
类型
{% if myPhoneNumber is phone_number_of_type('MOBILE') }} %} ... {% endif %}
PHP模板
format()
phone_number_helper
中的format()
方法接受两个参数:一个libphonenumber\PhoneNumber
对象和一个可选的libphonenumber\PhoneNumberFormat
常量名称或值。
例如,要将$myPhoneNumber
格式化为libphonenumber\PhoneNumberFormat::NATIONAL
格式,可以使用
<?php echo $view['phone_number_helper']->format($myPhoneNumber, 'NATIONAL') ?>
或
<?php echo $view['phone_number_helper']->format($myPhoneNumber, \libphonenumber\PhoneNumberFormat::NATIONAL) ?>
默认情况下,电话号码以libphonenumber\PhoneNumberFormat::INTERNATIONAL
格式格式化。
isType()
phone_number_helper
中的isType()
方法接受两个参数:一个libphonenumber\PhoneNumber
对象和一个可选的libphonenumber\PhoneNumberType
常量名称或值。
例如,要检查$myPhoneNumber是否为libphonenumber\PhoneNumberType::MOBILE类型
<?php if $view['phone_number_helper']->isType($myPhoneNumber, 'MOBILE'): ?> ... <?php endif; ?>
或
<?php if $view['phone_number_helper']->isType($myPhoneNumber, \libphonenumber\PhoneNumberType::MOBILE): ?> ... <?php endif; ?>
序列化libphonenumber\PhoneNumber
对象
需要jms/serializer-bundle
。
libphonenumber\PhoneNumber
实例会自动以E.164格式序列化。
可以通过将类型设置为libphonenumber\PhoneNumber
从国际格式反序列化电话号码。例如
use JMS\Serializer\Annotation\Type; /** * @Type("libphonenumber\PhoneNumber") */ private $phoneNumber;
在表单中使用libphonenumber\PhoneNumber
对象
您可以使用PhoneNumberType
(对于Symfony 2.7为phone_number
)表单类型来创建电话号码字段。有两种小部件可用。
单行文本字段
单行文本字段允许用户输入完整的电话号码。如果没有输入国际前缀,则假定号码是默认default_region
集的一部分。例如
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)); }
默认情况下,default_region
和format
选项分别为PhoneNumberUtil::UNKNOWN_REGION
和PhoneNumberFormat::INTERNATIONAL
。
国家选择字段
电话号码可以被拆分为国家选择和电话号码文本字段。这使用户可以选择相关的国家(从可自定义的列表中)并输入电话号码,而无需国际拨号。
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'))); }
这会产生首选的“泽西岛”和“英国”,以及常规的“法国”和“美国”选择。
默认情况下,country_choices
为空,这意味着包括所有国家,同样preferred_country_choices
也是如此。可以指定country_placeholder
选项来在列表上方创建占位符选项。
验证电话号码
您可以使用Misd\PhoneNumberBundle\Validator\Constraints\PhoneNumber
约束来确保libphonenumber\PhoneNumber
对象或纯字符串是有效的电话号码。例如
use Misd\PhoneNumberBundle\Validator\Constraints\PhoneNumber as AssertPhoneNumber; /** * @AssertPhoneNumber */ private $phoneNumber;
您可以通过defaultRegion
属性设置默认区域
use Misd\PhoneNumberBundle\Validator\Constraints\PhoneNumber as AssertPhoneNumber; /** * @AssertPhoneNumber(defaultRegion="GB") */ private $phoneNumber;
默认情况下,任何有效的电话号码都将被接受。您可以通过type
属性来限制类型,认可的值
Misd\PhoneNumberBundle\Validator\Constraints\PhoneNumber::ANY
(默认)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
(注意,libphonenumber不能总是区分移动和固定电话号码(例如在美国),在这种情况下将接受。)
/** * @AssertPhoneNumber(type="mobile") */ private $mobilePhoneNumber;
翻译
该包包含表单字段和验证约束的翻译。
在多种语言使用多个术语表示移动电话的情况下,通用语言区域将使用“mobile”术语,而国家特定区域将使用相关术语。例如,在英语中,en
使用“mobile”,en_US
使用“cell”,en_SG
使用“handphone”。
如果您的语言还没有翻译,请随时提交一个pull request来添加它们!