Fügt Laravel auf der Grundlage des PHP -Ports von libphonNumber durch Google eine Telefonnummernfunktion hinzu.
Schauen Sie sich das Verhalten dieses Pakets in der Demo an.
Führen Sie den folgenden Befehl aus, um die neueste anwendbare Version des Pakets zu installieren:
composer require propaganistas/laravel-phone
Der Dienstanbieter wird automatisch von Laravel entdeckt.
Fügen Sie in Ihrem Sprachenverzeichnis eine zusätzliche Übersetzung in jeder validation.php
-Sprachdatei hinzu:
' phone ' => ' The :attribute field must be a valid number. ' ,
Verwenden Sie das Schlüsselwort phone
in Ihrem Validierungsregeln -Array oder verwenden Sie die PropaganistasLaravelPhoneRulesPhone
um die Regel auf ausdrucksstarke Weise zu definieren.
Um die zulässigen Ursprungsländer Einschränkungen zu setzen, können Sie die zulässigen Ländercodes ausdrücklich angeben.
' phonefield ' => ' phone:US,BE ' ,
// ' phonefield ' => ( new Phone )-> country ([ ' US ' , ' BE ' ])
Um die Dinge dynamischer zu gestalten, können Sie auch mit einem anderen Datenfeld übereinstimmen, der einen Ländercode enthält. Zum Beispiel, um eine Telefonnummer zu verlangen, um dem bereitgestellten Wohnsitzland zu entsprechen. Stellen Sie sicher, dass das Feld des Landes den gleichen Namen wie das Telefonfeld hat, jedoch mit _country
für die automatische Erkennung angehängt oder dem Namen des benutzerdefinierten Landes als Parameter für den Validator angeben:
' 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 ' ,
HINWEIS: Ländercodes sollten ISO 3166-1 Alpha-2-konform sein.
Verwenden Sie den INTERNATIONAL
Parameter, um eine gültige international formatierte Telefonnummer neben den Whitelist -Ländern zu unterstützen. Dies kann nützlich sein, wenn Sie lokal formatierte Zahlen aus einem bestimmten Land erwarten, aber auch eine andere eingetragene Fremdnummer akzeptieren möchten:
' phonefield ' => ' phone:INTERNATIONAL,BE ' ,
// ' phonefield ' => ( new Phone )-> international ()-> country ( ' BE ' )
Um Einschränkungen für den Nummerntyp anzugeben, fügen Sie einfach die zulässigen Typen am Ende der Parameter an, z. B.:
' phonefield ' => ' phone:mobile ' ,
// ' phonefield ' => ( new Phone )-> type ( ' mobile ' )
Die gängigsten Typen sind mobile
und fixed_line
und können Sie gerne die hier definierten Typen verwenden.
Bereiten Sie einen Typ mit einem Ausrufezeichen vor, um ihn stattdessen auf die schwarze Liste zu setzen. Beachten Sie, dass Sie niemals gleichzeitig whitelistete und schwarze Liste verwenden können.
' phonefield ' => ' phone:!mobile ' ,
// ' phonefield ' => ( new Phone )-> notType ( ' mobile ' )
Sie können auch die sanfende Validierung mithilfe des LENIENT
aktivieren. Bei aktivierter Nachsicht wird nur die Länge der Zahl anstelle der tatsächlichen Trägermuster überprüft.
' phonefield ' => ' phone:LENIENT ' ,
// ' phonefield ' => ( new Phone )-> lenient ()
Es werden zwei Gussklassen zur automatischen Besetzung eloquenter Modellattribute vorgesehen:
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 ' ,
];
}
Beide Klassen geben den Datenbankwert automatisch auf ein PhonNumber -Objekt zur weiteren Verwendung in Ihrer Anwendung.
$ user -> phone // PhoneNumber object or null
Bei der Festlegung eines Wertes akzeptieren beide einen String -Wert oder ein PhoneNumber -Objekt. Der RawPhoneNumberCast
mutiert den Datenbankwert für die RAW -Eingangsnummer, während der E164PhoneNumberCast
eine formatierte E.164 -Telefonnummer in die Datenbank schreibt.
Im Falle von RawPhoneNumberCast
muss die Besetzung auf das Telefonland angedeutet werden, um die RAW -Nummer ordnungsgemäß in ein Telefonobjekt zu analysieren. Im Falle von E164PhoneNumberCast
und der zu festen Wert ist noch nicht in einem internationalen Format, muss die Besetzung auf das Telefonland angedeutet werden, um den Wert ordnungsgemäß zu mutieren.
Beide Klassen akzeptieren die Castparameter auf die gleiche Weise:
_country
(z. B. Telefon_country) satt wird, erkennt die Besetzung es automatisch. public $ casts = [
' phone_1 ' => RawPhoneNumberCast ::class. ' :country_field ' ,
' phone_2 ' => E164PhoneNumberCast ::class. ' :BE ' ,
];
Wichtiger Hinweis: Beide Abgüsse erwarten gültige Telefonnummern, um reibungslos von/in PhoneNumber -Objekte zu konvertieren. Bitte validieren Sie Telefonnummern, bevor Sie sie auf ein Modell einstellen. Weitere Informationen finden Sie in der Validierungsdokumentation, um zu erfahren, wie Sie Telefonnummern validieren können.
E164PhoneNumberCast
Aufgrund der Art von E164PhoneNumberCast
wird ein gültiges Landattribut erwartet, wenn die Anzahl nicht im internationalen Format verabschiedet wird. Da Abgüsse in der Reihenfolge der angegebenen Werte angewendet werden, sollten Sie das Landattribut einstellen, bevor Sie das Attribut zur Telefonnummer festlegen. Andernfalls stößt E164PhoneNumberCast
auf einen leeren Länderwert und macht eine unerwartete Ausnahme.
// 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 ' ;
Eine Telefonnummer kann in die PropaganistasLaravelPhonePhoneNumber
-Klasse eingewickelt werden, um sie mit nützlichen Nutzmethoden zu verbessern. Es ist sicher, diese Objekte in Ansichten direkt zu verweisen oder in der Datenbank zu speichern, da sie sich anmutig auf das E.164 -Format abbauen.
use Propaganistas LaravelPhone PhoneNumber ;
( string ) new PhoneNumber ( ' +3212/34.56.78 ' ); // +3212345678
( string ) new PhoneNumber ( ' 012 34 56 78 ' , ' BE ' ); // +3212345678
Eine PhoneNumber kann auf verschiedene Weise formatiert werden:
$ 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
Holen Sie sich einige Informationen über die Telefonnummer:
$ phone = new PhoneNumber ( ' 012 34 56 78 ' , ' BE ' );
$ phone -> getType (); // 'fixed_line'
$ phone -> isOfType ( ' fixed_line ' ); // true
$ phone -> getCountry (); // 'BE'
$ phone -> isOfCountry ( ' BE ' ); // true
Überprüfen Sie, ob eine bestimmte Telefonnummer (nicht) gleich einem anderen ist:
$ 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
Das Paket enthält die phone()
, die eine PropaganistasLaravelPhonePhoneNumber
-Instanz oder die formatierte Zeichenfolge zurückgibt, wenn $format
bereitgestellt wurde:
phone ( $ number , $ country = [], $ format = null )
Haftungsausschluss: Die Handhabung der Telefonnummer ist in jeder Anwendung ganz anders. Die unten erwähnten Themen sind daher als Set von Gedankenstartern gedacht; Unterstützung wird nicht bereitgestellt.
Das Speichern von Telefonnummern in einer Datenbank war schon immer ein spekulatives Thema, und es gibt einfach keine Silberkugel. Es hängt alles von den Anforderungen Ihrer Anwendung ab. Hier sind einige Dinge zu berücksichtigen, zusammen mit einem Implementierungsvorschlag. Ihre ideale Datenbank -Setup wird wahrscheinlich eine Kombination einiger der unten beschriebenen Zeiger sein.
Das E.164 -Format global und einzigartig identifiziert eine Telefonnummer weltweit. Es impliziert auch inhärent ein bestimmtes Land und kann dem phone()
Helfer als IS geliefert werden.
Sie werden brauchen:
Beispiel:
012/45.65.78
phone
(varchar) = +3212456578
Wenn Sie formatierte Telefonnummern speichern, verliert sich die Rohbenutzereingabe unbehaglich. Es kann vorteilhaft sein, Ihren Benutzern ihre eigene Eingabemummer zu präsentieren, beispielsweise in Bezug auf verbesserte Benutzererfahrung.
Sie werden brauchen:
Beispiel:
012/34.56.78
phone
(varchar) = 012/34.56.78
phone_country
(varchar) = BE
Durch die Durchsuchen von Telefonnummern kann schnell lächerlich komplex werden und erfordert immer ein tiefes Verständnis des Kontextes und des Umfangs Ihrer Anwendung. Hier ist ein möglicher Ansatz, der viele "natürliche" Anwendungsfälle abdeckt.
Sie werden brauchen:
saving()
Beobachter (oder gleichwertig), um die Varianten vor der Persistenz vorzubeugenBeispiel:
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 ) . ' % ' )
});