根據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 ) . ' % ' )
});