Ajoute des fonctionnalités de numéro de téléphone à Laravel en fonction du port PHP de LibPhonenumber par Google.
Découvrez le comportement de ce package dans la démo.
Exécutez la commande suivante pour installer la dernière version applicable du package:
composer require propaganistas/laravel-phone
Le fournisseur de services est découvert automatiquement par Laravel.
Dans votre répertoire de langues, ajoutez une traduction supplémentaire dans chaque fichier de langage validation.php
:
' phone ' => ' The :attribute field must be a valid number. ' ,
Utilisez le mot clé phone
dans votre tableau de règles de validation ou utilisez la classe de règles PropaganistasLaravelPhoneRulesPhone
pour définir la règle de manière expressive.
Pour mettre des contraintes sur les pays d'origine autorisés, vous pouvez explicitement spécifier les codes de pays autorisés.
' phonefield ' => ' phone:US,BE ' ,
// ' phonefield ' => ( new Phone )-> country ([ ' US ' , ' BE ' ])
Ou pour rendre les choses plus dynamiques, vous pouvez également correspondre à un autre champ de données détenant un code de pays. Par exemple, pour nécessiter un numéro de téléphone pour correspondre au pays de résidence fourni. Assurez-vous que le champ du pays a le même nom que le champ téléphonique mais avec _country
ajout pour la découverte automatique, ou fournissez votre nom de champ de pays personnalisé comme paramètre au validateur:
' 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 ' ,
Remarque: Les codes de pays doivent être conformes à l'ISO 3166-1 Alpha-2 .
Pour prendre en charge tout numéro de téléphone à formaté international valide à côté des pays de liste blanche, utilisez le paramètre INTERNATIONAL
. Cela peut être utile lorsque vous vous attendez à des numéros formatés localement à partir d'un pays spécifique, mais que vous souhaitez également accepter tout autre numéro étranger saisi correctement:
' phonefield ' => ' phone:INTERNATIONAL,BE ' ,
// ' phonefield ' => ( new Phone )-> international ()-> country ( ' BE ' )
Pour spécifier des contraintes sur le type de nombre, ajoutez simplement les types autorisés à la fin des paramètres, par exemple:
' phonefield ' => ' phone:mobile ' ,
// ' phonefield ' => ( new Phone )-> type ( ' mobile ' )
Les types les plus courants sont mobile
et fixed_line
, mais n'hésitez pas à utiliser l'un des types définis ici.
Présentez un type avec une marque d'exclamation pour la liste noire à la place. Notez que vous ne pouvez jamais utiliser en même temps des types de liste blanche et sur liste noire.
' phonefield ' => ' phone:!mobile ' ,
// ' phonefield ' => ( new Phone )-> notType ( ' mobile ' )
Vous pouvez également activer la validation clémente en utilisant le paramètre LENIENT
. Avec la clémence activée, seule la longueur du nombre est vérifiée au lieu des modèles de transporteur réels.
' phonefield ' => ' phone:LENIENT ' ,
// ' phonefield ' => ( new Phone )-> lenient ()
Deux classes de distribution sont fournies pour la coulée automatique des attributs de modèle éloquents:
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 ' ,
];
}
Les deux classes jettent automatiquement la valeur de la base de données à un objet Phonenumber pour une utilisation ultérieure dans votre application.
$ user -> phone // PhoneNumber object or null
Lors de la définition d'une valeur, ils acceptent tous deux une valeur de chaîne ou un objet Phonenumber. Le RawPhoneNumberCast
mute la valeur de la base de données au numéro d'entrée brut, tandis que le E164PhoneNumberCast
écrit un numéro de téléphone e.164 formaté dans la base de données.
En cas de RawPhoneNumberCast
, la distribution doit être laissée entendre sur le pays de téléphone afin d'analyser correctement le numéro brut dans un objet téléphonique. Dans le cas de E164PhoneNumberCast
et que la valeur à définir n'est pas déjà dans un format international, la distribution doit être laissée entendre sur le pays de téléphone afin de muter correctement la valeur.
Les deux classes acceptent les paramètres de distribution de la même manière:
_country
(par exemple Phone_country), le casting le détectera et l'utilisera automatiquement. public $ casts = [
' phone_1 ' => RawPhoneNumberCast ::class. ' :country_field ' ,
' phone_2 ' => E164PhoneNumberCast ::class. ' :BE ' ,
];
Remarque importante: Les deux lancers s'attendent à des numéros de téléphone valides afin de se convertir en douceur des objets / phonéberge. Veuillez valider les numéros de téléphone avant de les définir sur un modèle. Reportez-vous à la documentation de validation pour apprendre à valider les numéros de téléphone.
E164PhoneNumberCast
En raison de la nature de E164PhoneNumberCast
un attribut de pays valide est attendu si le nombre n'est pas passé au format international. Étant donné que les moulages sont appliqués dans l'ordre des valeurs données, assurez-vous de définir l'attribut country avant de définir l'attribut de numéro de téléphone. Sinon, E164PhoneNumberCast
rencontrera une valeur country vide et lèvera une exception inattendue.
// 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 ' ;
Un numéro de téléphone peut être enveloppé dans la classe PropaganistasLaravelPhonePhoneNumber
pour l'améliorer avec des méthodes d'utilité utiles. Il est sûr de référencer directement ces objets dans les vues ou lors de l'enregistrement de la base de données car ils se dégraderont gracieusement au format E.164.
use Propaganistas LaravelPhone PhoneNumber ;
( string ) new PhoneNumber ( ' +3212/34.56.78 ' ); // +3212345678
( string ) new PhoneNumber ( ' 012 34 56 78 ' , ' BE ' ); // +3212345678
Un numéro de phonin peut être formaté de diverses manières:
$ 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
Obtenez des informations sur le numéro de téléphone:
$ phone = new PhoneNumber ( ' 012 34 56 78 ' , ' BE ' );
$ phone -> getType (); // 'fixed_line'
$ phone -> isOfType ( ' fixed_line ' ); // true
$ phone -> getCountry (); // 'BE'
$ phone -> isOfCountry ( ' BE ' ); // true
Vérifiez si un numéro de téléphone donné est (pas) égal à un autre:
$ 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
Le package expose la fonction d'assistance phone()
qui renvoie une instance PropaganistasLaravelPhonePhoneNumber
ou la chaîne formatée si $format
était fourni:
phone ( $ number , $ country = [], $ format = null )
Avertissement: la gestion des numéros de téléphone est assez différente dans chaque application. Les sujets mentionnés ci-dessous sont donc destinés à un ensemble de démarreurs de pensée; Le soutien ne sera pas fourni.
Le stockage des numéros de téléphone dans une base de données a toujours été un sujet spéculatif et il n'y a tout simplement pas de solution miracle. Tout dépend des exigences de votre demande. Voici quelques éléments à prendre en compte, ainsi qu'une suggestion de mise en œuvre. Votre configuration de base de données idéale sera probablement une combinaison de certains des pointeurs détaillés ci-dessous.
Le format E.164 à l'échelle mondiale et unique identifie un numéro de téléphone à travers le monde. Il implique également intrinsèquement un pays spécifique et peut être fourni en tant qu'adhésion au phone()
.
Vous aurez besoin:
Exemple:
012/45.65.78
phone
(Varchar) = +3212456578
Si vous stockez les numéros de téléphone formatés, l'entrée de l'utilisateur brut se perdra sansrages. Il peut être avantageux de présenter à vos utilisateurs leur propre numéro de téléphone entré, par exemple en termes d'amélioration de l'expérience utilisateur.
Vous aurez besoin:
Exemple:
012/34.56.78
phone
(Varchar) = 012/34.56.78
phone_country
(varchar) = BE
La recherche dans les numéros de téléphone peut rapidement devenir ridiculement complexe et nécessitera toujours une compréhension approfondie du contexte et de l'étendue de votre application. Voici une approche possible couvrant de nombreux cas d'utilisation "naturels".
Vous aurez besoin:
saving()
(ou équivalent) pour préfabriquer les variantes avant la persistanceExemple:
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 ) . ' % ' )
});