kontsevoye / phone-number-bundle
Requires
- php: >7.2.5
- giggsey/libphonenumber-for-php: ^8.0
- symfony/framework-bundle: ^3.4|^4.3|^5.0
- symfony/intl: ^3.4|^4.3|^5.0
Requires (Dev)
- doctrine/doctrine-bundle: ^1.12|^2.0
- phpunit/phpunit: ^8.4
- symfony/form: ^3.4|^4.3|^5.0
- symfony/property-access: ^3.4|^4.3|^5.0
- symfony/serializer: ^3.4|^4.3|^5.0
- symfony/twig-bundle: ^3.4|^4.3|^5.0
- symfony/validator: ^3.4|^4.3|^5.0
Suggests
- doctrine/doctrine-bundle: Add a DBAL mapping type
- symfony/form: Add a data transformer
- symfony/property-access: Choose a path in the validation constraint
- symfony/serializer: Serialize/deserialize phone numbers using Symfony library
- symfony/twig-bundle: Format phone numbers in Twig templates
- symfony/validator: Add a validation constraint
Replaces
- misd/phone-number-bundle: v3.4.2
- v3.4.2
- v3.4.1
- v3.4.0
- v3.3.3
- v3.3.2
- v3.3.1
- v3.3.0
- v3.2.1
- v3.2.0
- v3.1.1
- v3.1.0
- v3.0.0
- dev-master / 2.0.x-dev
- v2.0.2
- v2.0.1
- v2.0.0
- 1.3.x-dev
- 1.3.4
- 1.3.3
- v1.3.2
- v1.3.1
- v1.3.0
- 1.2.x-dev
- v1.2.0
- v1.1.3
- v1.1.2
- v1.1.1
- v1.1.0
- 1.0.x-dev
- v1.0.6
- v1.0.5
- v1.0.4
- v1.0.3
- v1.0.2
- v1.0.1
- v1.0.0
- dev-license
- dev-clean-dic
- dev-remove-compiler-pass
This package is not auto-updated.
Last update: 2021-10-14 16:02:11 UTC
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() ); }
使用
服务
以下服务可用
| 服务 | ID | libphonenumber 版本 |
|---|---|---|
libphonenumber\PhoneNumberUtil |
libphonenumber.phone_number_util |
|
libphonenumber\geocoding\PhoneNumberOfflineGeocoder |
libphonenumber.phone_number_offline_geocoder |
>=5.8.8 |
libphonenumber\ShortNumberInfo |
libphonenumber.short_number_info |
>=5.8 |
libphonenumber\PhoneNumberToCarrierMapper |
libphonenumber.phone_number_to_carrier_mapper |
>=5.8.8 |
libphonenumber\PhoneNumberToTimeZonesMapper |
libphonenumber.phone_number_to_time_zones_mapper |
>=5.8.8 |
要将字符串解析为 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'))); }
这会产生首选的“Jersey”和“United Kingdom”,以及常规的“France”和“United States”。
默认情况下,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_LINEMisd\PhoneNumberBundle\Validator\Constraints\PhoneNumber::MOBILEMisd\PhoneNumberBundle\Validator\Constraints\PhoneNumber::PAGERMisd\PhoneNumberBundle\Validator\Constraints\PhoneNumber::PERSONAL_NUMBERMisd\PhoneNumberBundle\Validator\Constraints\PhoneNumber::PREMIUM_RATEMisd\PhoneNumberBundle\Validator\Constraints\PhoneNumber::SHARED_COSTMisd\PhoneNumberBundle\Validator\Constraints\PhoneNumber::TOLL_FREEMisd\PhoneNumberBundle\Validator\Constraints\PhoneNumber::UANMisd\PhoneNumberBundle\Validator\Constraints\PhoneNumber::VOIPMisd\PhoneNumberBundle\Validator\Constraints\PhoneNumber::VOICEMAIL
(注意,libphonenumber 无法总是区分移动电话和固定电话(例如在美国),在这种情况下,它将被接受。)
/** * @AssertPhoneNumber(type="mobile") */ private $mobilePhoneNumber;
翻译
该捆绑包包含表单字段和验证约束的翻译。
在那些使用多个术语指代手机的语种中,通用语言区域将使用“mobile”这个术语,而特定国家区域将使用相应的术语。例如,在英语中,en 使用“mobile”,en_US 使用“cell”,而 en_SG 使用“handphone”。
如果你的语言还没有翻译,欢迎你提交一个pull request来添加它们!