GoogleによるLibphphoneNumberの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 Fieldが電話フィールドと同じ名前を持っているが、 _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 ()
雄弁なモデル属性の自動鋳造用に2つのキャストクラスが提供されています。
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
データベース値を生の入力番号に変異させ、 E164PhoneNumberCast
フォーマットされたE.164の電話番号をデータベースに書き込みます。
RawPhoneNumberCast
の場合、RAW番号を電話オブジェクトに適切に解析するために、キャストを電話国について示唆する必要があります。 E164PhoneNumberCast
と設定する値がまだ国際的な形式ではない場合、値を適切に変異させるために、キャストを電話国について示唆する必要があります。
どちらのクラスも同じ方法でキャストパラメーターを受け入れます。
_country
(eg phone_country)で接尾辞が存在する場合、キャストはそれを自動的に検出して使用します。 public $ casts = [
' phone_1 ' => RawPhoneNumberCast ::class. ' :country_field ' ,
' phone_2 ' => E164PhoneNumberCast ::class. ' :BE ' ,
];
重要な注意:両方のキャストは、有効な電話番号を期待して、電話機のオブジェクトからスムーズに変換するために期待しています。モデルに設定する前に、電話番号を検証してください。検証文書を参照して、電話番号の検証方法を学びます。
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
パッケージは、 $format
が提供された場合、 PropaganistasLaravelPhonePhoneNumber
インスタンスまたはフォーマットされた文字列を返すphone()
ヘルパー関数を公開します。
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 ) . ' % ' )
});