Google의 LibphoneNumber의 PHP 포트를 기반으로 Laravel에 전화 번호 기능을 추가합니다.
데모 에서이 패키지의 동작을 확인하십시오.
다음 명령을 실행하여 최신 적용 가능한 패키지 버전을 설치하십시오.
composer require propaganistas/laravel-phone
서비스 제공 업체는 Laravel에 의해 자동으로 발견됩니다.
언어 디렉토리에서 모든 validation.php
언어 파일에 추가 변환을 추가하십시오.
' phone ' => ' The :attribute field must be a valid number. ' ,
유효성 검사 규칙 배열에서 phone
키워드를 사용하거나 PropaganistasLaravelPhoneRulesPhone
규칙 클래스를 사용하여 규칙을 표현적인 방식으로 정의하십시오.
허용 된 출발 국가에 제약 을가하려면 허용 된 국가 코드를 명시 적으로 지정할 수 있습니다.
' 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
매개 변수를 사용하여 관대 한 유효성 검사를 활성화 할 수도 있습니다. Leniency가 활성화되면 실제 캐리어 패턴 대신 숫자의 길이 만 확인됩니다.
' 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 ' ,
];
}
두 클래스 모두 응용 프로그램에 추가로 사용하기 위해 데이터베이스 값을 PoneNumber 객체에 자동으로 시전합니다.
$ 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
패키지는 PropaganistasLaravelPhonePhoneNumber
$format
를 반환하는 phone()
도우미 기능을 노출시킵니다.
phone ( $ number , $ country = [], $ format = null )
면책 조항 : 전화 번호 처리는 각 응용 프로그램마다 상당히 다릅니다. 따라서 아래에 언급 된 주제는 일련의 사고 스타터입니다. 지원은 제공되지 않습니다 .
데이터베이스에 전화 번호를 저장하는 것은 항상 투기적인 주제였으며 단순히은 총알이 없습니다. 그것은 모두 응용 프로그램의 요구 사항에 따라 다릅니다. 구현 제안과 함께 고려해야 할 사항이 있습니다. 이상적인 데이터베이스 설정은 아마도 아래에 자세히 설명 된 일부 포인터의 조합 일 것입니다.
E.164 형식은 전 세계적으로 전 세계적으로 전화 번호를 식별합니다. 또한 본질적으로 특정 국가를 암시하며 phone()
도우미에 as-를 공급할 수 있습니다.
당신은 필요합니다 :
예:
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 ) . ' % ' )
});