根据Google的LibphoneNumber的PHP端口,将电话号码功能添加到Laravel。
在演示中查看此软件包的行为。
运行以下命令以安装软件包的最新适用版本:
composer require propaganistas/laravel-phone
服务提供商会被Laravel自动发现。
在您的语言目录中,在每个validation.php
中添加额外的翻译。php语言文件:
' phone ' => ' The :attribute field must be a valid number. ' ,
在验证规则数组中使用phone
关键字,或使用PropaganistasLaravelPhoneRulesPhone
Rule类以表达方式定义规则。
为了对允许的原始国家施加限制,您可以明确指定允许的国家代码。
' phonefield ' => ' phone:US,BE ' ,
// ' phonefield ' => ( new Phone )-> country ([ ' US ' , ' BE ' ])
或使事情变得更加动态,您还可以与拥有国家代码的另一个数据字段匹配。例如,需要一个电话号码来匹配所提供的居住国。确保国家字段具有与电话字段相同的名称,但附加了_country
以自动发现,或提供您的自定义国家字段名称作为验证者的参数:
' phonefield ' => ' phone ' ,
// ' phonefield ' => ( new Phone )
' phonefield_country ' => ' required_with:phonefield ' ,
' phonefield ' => ' phone:custom_country_field ' ,
// ' phonefield ' => ( new Phone )-> countryField ( ' custom_country_field ' )
' custom_country_field ' => ' required_with:phonefield ' ,
注意:国家代码应为ISO 3166-1 Alpha-2符合符合条件。
为了支持白名单国家旁边的任何有效的国际格式电话号码,请使用INTERNATIONAL
参数。当您期望从特定国家 /地区获得本地格式的数字,但也希望接受正确输入的任何其他外国号码时,这可能很有用:
' phonefield ' => ' phone:INTERNATIONAL,BE ' ,
// ' phonefield ' => ( new Phone )-> international ()-> country ( ' BE ' )
要在数字类型上指定约束,只需将允许的类型附加到参数末尾,例如:
' phonefield ' => ' phone:mobile ' ,
// ' phonefield ' => ( new Phone )-> type ( ' mobile ' )
最常见的类型是mobile
和fixed_line
,但可以随意使用此处定义的任何类型。
准备带有感叹号标记的类型以黑名单。请注意,您永远无法同时使用白名单和黑名单类型。
' phonefield ' => ' phone:!mobile ' ,
// ' phonefield ' => ( new Phone )-> notType ( ' mobile ' )
您还可以使用LENIENT
参数启用宽大验证。启用宽大处理后,仅检查数字的长度,而不是实际的载波模式。
' phonefield ' => ' phone:LENIENT ' ,
// ' phonefield ' => ( new Phone )-> lenient ()
提供了两个演员级课程,以自动铸造雄辩的模型属性:
use Illuminate Database Eloquent Model ;
use Propaganistas LaravelPhone Casts RawPhoneNumberCast ;
use Propaganistas LaravelPhone Casts E164PhoneNumberCast ;
class User extends Model
{
public $ casts = [
' phone_1 ' => RawPhoneNumberCast ::class. ' :BE ' ,
' phone_2 ' => E164PhoneNumberCast ::class. ' :BE ' ,
];
}
这两个类都自动将数据库值投放到Phonenumber对象中,以在您的应用程序中进一步使用。
$ user -> phone // PhoneNumber object or null
设置值时,它们既接受字符串值或音载体对象。 RawPhoneNumberCast
将数据库值变为原始输入号,而E164PhoneNumberCast
将格式的e.164电话号码写入数据库。
如果RawPhoneNumberCast
,则需要暗示演员阵容,以便将原始数字正确分解为电话对象。如果E164PhoneNumberCast
和要设定的价值尚未以某种国际格式设置,则需要暗示演员阵容,以便正确地变异该价值。
两类都以相同的方式接受演员参数:
_country
(例如Phone_country)后缀时,铸件将自动检测并使用它。 public $ casts = [
' phone_1 ' => RawPhoneNumberCast ::class. ' :country_field ' ,
' phone_2 ' => E164PhoneNumberCast ::class. ' :BE ' ,
];
重要说明:两种铸件都期望有效的电话号码,以便从/转换为Phonenumber对象。请在将电话号码设置在模型上之前验证电话号码。请参阅验证文档,以了解如何验证电话号码。
E164PhoneNumberCast
由于E164PhoneNumberCast
的性质,如果未以国际格式通过该数字,则预计有效的国家属性。由于铸件是按照给定值的顺序应用的,因此请确保在设置电话号码属性之前设置国家属性。否则, E164PhoneNumberCast
将遇到空旷的国家价值并提出意外的例外。
// Wrong
$ model -> fill ([
' phone ' => ' 012 34 56 78 ' ,
' phone_country ' => ' BE ' ,
]);
// Correct
$ model -> fill ([
' phone_country ' => ' BE ' ,
' phone ' => ' 012 34 56 78 ' ,
]);
// Wrong
$ model -> phone = ' 012 34 56 78 ' ;
$ model -> phone_country = ' BE ' ;
// Correct
$ model -> phone_country = ' BE ' ;
$ model -> phone = ' 012 34 56 78 ' ;
可以将电话号码包裹在PropaganistasLaravelPhonePhoneNumber
类中,以通过有用的实用方法来增强它。可以安全地将这些对象直接引用在视图中或保存到数据库时,因为它们会优雅地降低到e.164格式。
use Propaganistas LaravelPhone PhoneNumber ;
( string ) new PhoneNumber ( ' +3212/34.56.78 ' ); // +3212345678
( string ) new PhoneNumber ( ' 012 34 56 78 ' , ' BE ' ); // +3212345678
可以通过各种方式对语音仪进行格式:
$ phone = new PhoneNumber ( ' 012/34.56.78 ' , ' BE ' );
$ phone -> format ( $ format ); // See libphonenumberPhoneNumberFormat
$ phone -> formatE164 (); // +3212345678
$ phone -> formatInternational (); // +32 12 34 56 78
$ phone -> formatRFC3966 (); // tel:+32-12-34-56-78
$ phone -> formatNational (); // 012 34 56 78
// Formats so the number can be called straight from the provided country.
$ phone -> formatForCountry ( ' BE ' ); // 012 34 56 78
$ phone -> formatForCountry ( ' NL ' ); // 00 32 12 34 56 78
$ phone -> formatForCountry ( ' US ' ); // 011 32 12 34 56 78
// Formats so the number can be clicked on and called straight from the provided country using a cellphone.
$ phone -> formatForMobileDialingInCountry ( ' BE ' ); // 012345678
$ phone -> formatForMobileDialingInCountry ( ' NL ' ); // +3212345678
$ phone -> formatForMobileDialingInCountry ( ' US ' ); // +3212345678
获取有关电话号码的一些信息:
$ phone = new PhoneNumber ( ' 012 34 56 78 ' , ' BE ' );
$ phone -> getType (); // 'fixed_line'
$ phone -> isOfType ( ' fixed_line ' ); // true
$ phone -> getCountry (); // 'BE'
$ phone -> isOfCountry ( ' BE ' ); // true
检查给定的电话号码是否(非)等于另一个:
$ phone = new PhoneNumber ( ' 012 34 56 78 ' , ' BE ' );
$ phone -> equals ( ' 012/34.56.76 ' , ' BE ' ) // true
$ phone -> equals ( ' +32 12 34 56 78 ' ) // true
$ phone -> equals ( $ anotherPhoneObject ) // true / false
$ phone -> notEquals ( ' 045 67 89 10 ' , ' BE ' ) // true
$ phone -> notEquals ( ' +32 45 67 89 10 ' ) // true
$ phone -> notEquals ( $ anotherPhoneObject ) // true / false
该软件包曝光phone()
辅助功能,该功能返回PropaganistasLaravelPhonePhoneNumber
实例或格式字符串(如果提供$format
:
phone ( $ number , $ country = [], $ format = null )
免责声明:每个应用程序中的电话号码处理都大不相同。因此,下面提到的主题是作为一组思想起动器。不会提供支持。
在数据库中存储电话号码一直是一个投机性的话题,根本没有银色子弹。这完全取决于您的应用程序的要求。以下是要考虑的一些事情,以及实施建议。您理想的数据库设置可能是下面详述的一些指针的组合。
e.164格式在全球范围内,唯一地标识了世界各地的电话号码。它还内在地暗示着一个特定的国家,可以将其作为phone()
助手提供。
您需要:
例子:
012/45.65.78
phone
(varchar)= +3212456578
如果您存储了格式的电话号码,则原始用户输入将无法丢失。向您的用户提供自己的输入电话号码,例如改善用户体验,可能是有益的。
您需要:
例子:
012/34.56.78
phone
(varchar)= 012/34.56.78
phone_country
(varchar) BE
通过电话号码进行搜索可能会很快变得荒谬的复杂,并且始终需要对应用程序的上下文和程度深入了解。这是一种可能涵盖许多“自然”用例的方法。
您需要:
saving()
观察者(或同等),以预填充变体之前的持久性例子:
12/34.56.78
public function saving ( User $ user )
{
if ( $ user -> isDirty ( ' phone ' ) && $ user -> phone ) {
$ user -> phone_normalized = preg_replace ( ' /[^0-9]/ ' , '' , $ user -> phone );
$ user -> phone_national = preg_replace ( ' /[^0-9]/ ' , '' , phone ( $ user -> phone , $ user -> phone_country )-> formatNational ());
$ user -> phone_e164 = phone ( $ user -> phone , $ user -> phone_country )-> formatE164 ();
}
}
phone_normalized
(varchar)= 12345678
phone_national
(varchar)= 012345678
phone_e164
(varchar)= +3212345678
// $search holds the search term
User :: where ( function ( $ query ) use ( $ search ) {
$ query -> where ( ' phone_normalized ' , ' LIKE ' , preg_replace ( ' /[^0-9]/ ' , '' , $ search ) . ' % ' )
-> orWhere ( ' phone_national ' , ' LIKE ' , preg_replace ( ' /[^0-9]/ ' , '' , $ search ) . ' % ' )
-> orWhere ( ' phone_e164 ' , ' LIKE ' , preg_replace ( ' /[^+0-9]/ ' , '' , $ search ) . ' % ' )
});