Добавляет функциональность номера телефона в Laravel на основе PHP -порта LibphoneNumber от Google.
Проверьте поведение этого пакета в демонстрации.
Запустите следующую команду, чтобы установить последнюю применимую версию пакета:
composer require propaganistas/laravel-phone
Поставщик услуг обнаруживается автоматически Laravel.
В вашем каталоге языков добавьте дополнительный перевод в каждом языковом файле validation.php
:
' phone ' => ' The :attribute field must be a valid number. ' ,
Используйте ключевое слово phone
в массиве правил проверки или используйте PropaganistasLaravelPhoneRulesPhone
Rule Class, чтобы выразить правило выразительным образом.
Чтобы наложить ограничения на разрешенные исходящие страны, вы можете явно указать разрешенные коды страны.
' 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 ()
Два класса актеров предназначены для автоматического листа красноречивых атрибутов модели:
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
, актеров необходимо намекнуть о стране по телефону, чтобы правильно разобрать необработанный номер в телефонный объект. В случае 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
PhonNeckumber может быть отформатирован по -разному:
$ 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 ) . ' % ' )
});