เพิ่มฟังก์ชั่นหมายเลขโทรศัพท์ให้กับ Laravel ตามพอร์ต PHP ของ Libphonenumber โดย Google
ตรวจสอบพฤติกรรมของแพ็คเกจนี้ในการสาธิต
เรียกใช้คำสั่งต่อไปนี้เพื่อติดตั้งแพ็คเกจเวอร์ชันล่าสุดที่เกี่ยวข้อง:
composer require propaganistas/laravel-phone
ผู้ให้บริการจะถูกค้นพบโดยอัตโนมัติโดย Laravel
ในไดเรกทอรีภาษาของคุณเพิ่มการแปลเพิ่มเติมในทุก ๆ ไฟล์ validation.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 ()
มีคลาส Cast สองคลาสสำหรับการคัดเลือกคุณลักษณะแบบจำลองการพูดคุยอัตโนมัติ:
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
เมื่อตั้งค่าค่าพวกเขาทั้งสองยอมรับค่าสตริงหรือวัตถุ phonenumber RawPhoneNumberCast
กลายพันธุ์ค่าฐานข้อมูลไปยังหมายเลขอินพุต RAW ในขณะที่ E164PhoneNumberCast
จะเขียนหมายเลขโทรศัพท์ E.164 ที่จัดรูปแบบไปยังฐานข้อมูล
ในกรณีของ RawPhoneNumberCast
นักแสดงจะต้องได้รับการบอกใบ้เกี่ยวกับประเทศโทรศัพท์เพื่อที่จะแยกวิเคราะห์หมายเลขดิบลงในวัตถุโทรศัพท์อย่างถูกต้อง ในกรณีของ E164PhoneNumberCast
และค่าที่จะตั้งค่าไม่ได้อยู่ในรูปแบบสากลบางอย่างนักแสดงจะต้องได้รับการบอกใบ้เกี่ยวกับประเทศโทรศัพท์เพื่อที่จะกลายพันธุ์อย่างถูกต้อง
ทั้งสองคลาสยอมรับพารามิเตอร์ Cast ในลักษณะเดียวกัน:
_country
(เช่น phone_country) นักแสดงจะตรวจจับและใช้งานโดยอัตโนมัติ public $ casts = [
' phone_1 ' => RawPhoneNumberCast ::class. ' :country_field ' ,
' phone_2 ' => E164PhoneNumberCast ::class. ' :BE ' ,
];
หมายเหตุสำคัญ: Casts ทั้งสองคาดว่าจะมีหมายเลขโทรศัพท์ ที่ถูกต้อง เพื่อแปลงจากวัตถุ Phonenumber อย่างราบรื่น โปรดตรวจสอบหมายเลขโทรศัพท์ก่อนที่จะตั้งค่าในรุ่น อ้างถึงเอกสารการตรวจสอบเพื่อเรียนรู้วิธีการตรวจสอบหมายเลขโทรศัพท์
E164PhoneNumberCast
เนื่องจากลักษณะของ E164PhoneNumberCast
จึงคาดว่าจะมีคุณลักษณะของประเทศที่ถูกต้องหากจำนวนไม่ผ่านในรูปแบบสากล เนื่องจาก CASTS ถูกนำไปใช้ตามลำดับของค่าที่กำหนดให้แน่ใจว่าได้ตั้งค่าแอตทริบิวต์ประเทศ ก่อน ตั้งค่าแอตทริบิวต์หมายเลขโทรศัพท์ มิฉะนั้น 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
phonenumber สามารถจัดรูปแบบได้หลายวิธี:
$ 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
หากคุณจัดเก็บหมายเลขโทรศัพท์ที่จัดรูปแบบการป้อนข้อมูลผู้ใช้ RAW จะหายไปอย่างไม่แน่นอน อาจเป็นประโยชน์ในการนำเสนอหมายเลขโทรศัพท์ที่ป้อนเข้าของตัวเองเช่นในแง่ของประสบการณ์การใช้งานที่ดีขึ้น
คุณจะต้อง:
ตัวอย่าง:
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 ) . ' % ' )
});