A free and open-source book on ZF3 for beginners


9.6. Примеры использования валидаторов

Далее мы рассмотрим примеры использования самых важных стандартных валидаторов. Мы опишем методы (и опции) валидатора и приведем фрагменты кода, показывающие, как инстанцировать валидатор и применить его к входным данным.

9.6.1. Валидаторы для проверки соответствия значения определенному формату

В этом разделе мы рассмотрим примеры использования валидаторов, связанных с проверкой соответствия входного значения определенному формату

9.6.1.1. Ip Validator

Класс валидатора предназначен для проверки того, является ли входное значение действительным IP-адресом. Если входное значение является IPv4-адресом 32, IPv6-адресом 33, IPvFuture-адресом 34 или буквенным IPv6-адресом [буквенный_^ipv6_адрес], валидатор возвращает значение true; иначе возвращается false. В случае неудачи, сообщения об ошибках можно извлечь с помощью метода getMessages().

32) Четвертая версия интернет протокола (Internet Protocol version 4 - IPv4) использует адреса, как правило, состоящие из четырех октетов, разделенных точками. В виде десятичных чисел запись выглядит как "192.168.56.101".

33) Шестая версия интернет протокола (Internet Protocol version 6 - IPv6) использует адреса, как правило, состоящие из восьми групп четырех шестнадцатеричных цифр, разделенных двоеточиями, например, "2001:0db8:85a3:0000:0000:8a2e:0370:7334".

34) IPvFuture весьма расплывчато определен в главе 3.2.2 RFC 3986.

35) Буквенный IPv6-address - это модификация обычного IPv6-адреса для использования внутри URL. (проблема с оригинальными IPv6-адресами в том, что символы ":" и "." в URL являются разделителями.)

Public-методы, предоставляемые валидатором Ip перечислены в таблице 9.3:

Таблица 9.3. Public-методы валидатора Ip
Имя метода Описание
__construct($options) Конструктор валидатора. Принимает список опций.
isValid($value) Возвращает true тогда и только тогда, когда значение является действительным IP-адресом.
getMessages() При неудачной валидации этот метод вернет массив сообщений об ошибках.
setOptions($options) Задает опции валидатора.

Метод setOptions() предоставляет возможность определить разрешенные типа IP-адресов:

По умолчанию разрешены все вышеперечисленные адреса кроме буквенных IPv6.

Ниже показан пример кода, демонстрирующий использование валидатора Ip.

<?php
use Zend\Validator\Ip;

// Создаем валидатор Ip.
$validator = new Ip();

// Настраиваем валидатор.
$validator->setOptions([
    'allowipv4'      => true,  // Разрешаем IPv4-адреса.
    'allowipv6'      => true,  // Разрешаем IPv6-адреса.
    'allowipvfuture' => false, // Разрешаем IPvFuture-адреса.
    'allowliteral'   => true,  // Разрешаем IP-адреса в буквенном формате.
  ]);

// Проверяем, является ли входное значение действительным IP-адресом (IPv4).
$isValid = $validator->isValid('192.168.56.101'); // Возвращает true

// Проверяем, является ли входное значение действительным IP-адресом (IPv6).
$isValid2 = $validator->isValid(
       '2001:0db8:85a3:0000:0000:8a2e:0370:7334'); // Возвращает true

// Передает недействительную строку (не содержащую IP-адрес).       
$isValid3 = $validator->isValid('abc'); // Возвращает false

9.6.1.2. Hostname Validator

Валидатор Hostname предназначен для проверки того, является ли заданное значение именем хоста, принадлежащим к набору разрешенных типов. Такими типами являются:

Public-методы, предоставляемые этим валидатором, перечислены в таблице 9.4:

Таблица 9.4. Public-методы валидатора Hostname
Имя метода Описание
__construct($options) Конструктор валидатора. Принимает список опций.
isValid($value) Вовращает true, если значение является действительным именем хоста; иначе возвращает false.
getMessages() При неудачной валидации этот метод вернет массив сообщений об ошибках.
setIpValidator($ipValidator) Позволяет установить собственный валидатор IP-адреса.
getIpValidator() Извлекает установленный валидатор IP-адреса.
setAllow() Определяет тип(ы) разрешенных имен хостов.
getAllow() Возвращает разрешенные имена хостов.
useIdnCheck() Определяет, включена ли проверка интернационализованных доменных имен (Internationalized Domain Names - IDN). По умолчанию эта опция установлена в значение true.
getIdnCheck() Возвращает true, если включена проверка IDN.
useTldCheck() Определяет, включена ли проверка доменов верхнего уровня (Top Level Domain - TLD). По умолчанию эта опция установлена в значение true.
getTldCheck() Возвращает true, если включена проверка TLD.

Вы можете определить, какие типы имен хостов разрешены, с помощью метода setAllow(). Он принимает комбинацию следующих констант:

По умолчанию разрешены только доменные имена.

Проверка имени хоста состоит из нескольких этапов, некоторые из которых могут быть пропущены в зависимости от опций валидатора:

  1. Если входное значение выглядит как IP-адрес, оно проверяется внутренним валидатором IP-адреса. Используемый для этого валидатор IP-адреса можно переопределить методом setIpValidator()`.

  2. Имя хоста делится на части домена (разделенные точками ".").

  3. Домен верхнего уровня (TLD) сверяется с белым списком доступных TLD. (это действие можно отключить методом useTldCheck()).

  4. Каждая часть домена проверяется в соответствии с правилами для допустимых доменных имен. Если доменное имя - IDN 36, оно сверяется с правилами действительных IDN (проверку IDN можно отключить методом useIdnCheck().

36) Интернационализованное доменное имя (internationalized domain name - IDN) - это доменное имя, которое содержит хотя бы одну метку, полностью или частично составленную из букв национальных алфавитов, например, арабского, китайского или русского.

Ниже показан пример кода, демонстрирующий использование валидатора Hostname.

<?php
use Zend\Validator\Hostname;

// Создаем валидатор Hostname.
$validator = new Hostname();

// Настраиваем валидатор.
$validator->setAllow(Hostname::ALLOW_DNS|Hostname::ALLOW_IP);

// Проверяем имя хоста.
$isValid = $validator->isValid('site1.example.com'); 
// Возвращает true.
$isValid2 = $validator->isValid('abc'); 
// Возвращает false (недействительное имя хоста).

9.6.1.3. Валидатор Uri

Валидатор Uri предназначен для проверки того, является ли входное значение единообразным идентификатором ресурса (Uniform Resource Identifier - URI) 37. При неудачной валидации сообщения об ошибках могут быть извлечены с помощью метода валидатора getMessages().

Пусть вас не смущает термин URI. В большинстве случаев вы можете считать URI обычными URL.

37) Единообразный идентификатор ресурса (URI) - это компактная последовательность символов, идентифицирующая абстрактный или физический ресурс. Единый указатель ресурса (URL) является типом URI. Однако, это не значит, что все URI это URL.

Public-методы, предоставляемые валидатором Uri, перечислены в таблице 9.5:

Таблица 9.5. Public-методы валидатора Uri
Имя метода Описание
__construct($options) Конструктор валидатора. Принимает список опций.
isValid($value) Вовращает true, если значение является действительным URI; иначе возвращает false.
getMessages() При неудачной валидации этот метод вернет массив сообщений об ошибках.
setUriHandler($uriHandler) Задает объект обработчика URI для этого валидатора.
getUriHandler() Извлекает объект обработчика URI.
setAllowAbsolute($allowAbsolute) Сообщает валидатору, допускаются ли абсолютные URI.
getAllowAbsolute() Возвращает true если допускаются абсолютные URI.
setAllowRelative($allowRelative) Сообщает валидатору, допускаются ли относительные URI.
getAllowRelative() Возвращает true если допускаются относительные URI.

Валидатор Uri внутренне использует так называемый объект обработчика URI, ответственный за разбор строки URI. По умолчанию в качестве обработчика URI используется класс Zend\Uri\Uri (если хотите, можете установить свой собственный обработчик URI с помощью метода setUriHandler()).

URI может быть абсолютным (например,"http://example.com/blog/2014/02/02/edit") или относительным (например, "2014/02/02/edit"). Вы можете указать, должен ли валидатор считать абсолютные и/или относительные URI допустимыми. Для этого используйте соответственно методы setAllowAbsolute() и setAllowRelative(). По умолчанию, оба типа URI считаются допустимыми.

Ниже показан пример кода, демонстрирующий использование валидатора Uri.

<?php
use Zend\Validator\Uri;

// Создаем валидатор Uri.
$validator = new Uri();

// Настраиваем валидатор.
$validator->setAllowAbsolute(true);
$validator->setAllowRelative(true);

// Проверяем URI.
$isValid = $validator->isValid('http://site1.example.com/application/index/index'); 
// Возвращает true.
$isValid2 = $validator->isValid('index/index'); 
// Возвращает true.

9.6.1.4. Валидатор Date

Валидатор Date предназначен для проверки того, являются ли входные данные датой в заданном формате.

При неудачной валидации сообщения об ошибках могут быть извлечены с помощью метода валидатора getMessages().

Public-методы, предоставляемые валидатором Date, перечислены в таблице 9.6:

Таблица 9.6. Public-методы валидатора Date
Имя метода Описание
__construct($options) Конструктор валидатора. Принимает список опций.
isValid($value) Вовращает true, если значение является строкой, содержащей дату в ожидаемом формате; иначе возвращает false.
getMessages() При неудачной валидации этот метод вернет массив сообщений об ошибках.
setFormat($format) Задает ожидаемый формат даты.
getFormat() Извлекает ожидаемый формат.

Для установки ожидаемого формата даты используйте метод setFormat().

Фильтр DateTimeFormatter внутренне использует класс DateTime из стандартной библиотеки PHP для преобразования и форматирования дат. Доступные форматы данных вы можете посмотреть в документации PHP для класса DateTime.

Ниже показан пример кода, демонстрирующий использование валидатора Date.

<?php
use Zend\Validator\Date;

// Создаем экземпляр валидатора.
$validator = new Date();

// Настраиваем валидатор.
$validator->setFormat('Y-m-d');

// Проверяем, является ли входное значение датой в ожидаемом формате.
$isValid = $validator->isValid('2014-04-04'); // Возвращает true.
$isValid2 = $validator->isValid('April 04, 2014'); // Возвращает false (непредвиденный формат).

9.6.1.5. Валидатор Regex

Этот валидатор позволяет проверить, соответствует ли заданная строка какому-либо регулярному выражению. Он возвращает true, если строка совпадает с регулярным выражением, иначе возвращается false. При неудачной валидации сообщения об ошибках могут быть извлечены с помощью метода валидатора getMessages().

Public-методы, предоставляемые валидатором Regex, перечислены в таблице 9.7:

Таблица 9.7. Public-методы валидатора Regex
Имя метода Описание
__construct($options) Конструктор валидатора. Принимает список опций.
isValid($value) Возвращает true тогда и только тогда, когда $value совпадает с заданным шаблоном регулярного выражения.
getMessages() При неудачной валидации этот метод вернет массив сообщений об ошибках.
setPattern($pattern) Задает шаблон регулярного выражения.
getPattern() Извлекает шаблон регулярного выражения.

Метод setPattern() позволяет задать регулярное выражение для проверки соответствия.

Синтаксис и примеры регулярных выражений можно посмотреть в разделе Шаблоны PCRE документации PHP.

Ниже показан пример кода, демонстрирующий использование валидатора Regex. Здесь мы используем регулярное выражение для проверки того, является ли входная строка действительным IPv4-адресом (такой адрес, как правило, состоит из четырех групп цифр, разделенных точками).

<?php
use Zend\Validator\Regex;

// Создаем валидатор Regex.
$validator = new Regex();

// Задаем регулярного выражения для проверки IP-адреса.
$validator->setPattern('\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b');

// Проверка на соответствие регулярному выражению.
$isValid = $validator->isValid("127.0.0.1"); // возвращает true.
$isValid2 = $validator->isValid("123"); // возвращает false.

9.6.2. Валидаторы для проверки того, что числовое значение лежит в заданном диапазоне

В этом разделе мы рассмотрим примеры использования валидаторов, связанных с проверкой того, находится ли числовое значение в определенном диапазоне.

9.6.2.1. Валидатор NotEmpty

Валидатор NotEmpty позволяет проверить, что входное значение не пустое. Это часто бывает полезным при работе с элементами форм или другими введенными пользователями данными, где вы можете использовать такой валидатор, чтобы гарантировать, что необходимые элементы содержат связанные с ними значения.

Public-методы, предоставляемые валидатором NotEmpty, перечислены в таблице 9.8:

Таблица 9.8. Public-методы валидатора NotEmpty
Имя метода Описание
__construct($options) Конструктор валидатора. Принимает список опций.
isValid($value) Возвращает true тогда и только тогда, когда $value - не пустое значение.
getMessages() При неудачной валидации этот метод вернет массив сообщений об ошибках.
setType($type) Задает типы значений, которые будут считаться пустыми.
getType() Возвращает типы.
getDefaultType() Возвращает типы по умолчанию.

Метод setType() указывает, какие типы переменных считать пустыми значениями. Этот метод принимает один аргумент $type, который может быть либо комбинацией ИЛИ констант, перечисленных в таблице 9.9, либо массивом, содержащим буквенные эквиваленты этих констант.

Таблица 9.9. Константы типов
Константа Числовое значение Буквенный эквивалент* Описание
BOOLEAN 1 "boolean" Считает булевое false пустым значением.
INTEGER 2 "integer" Считает integer-значение 0 пустым значением.
FLOAT 4 "float" Считает float-значение 0.0 пустым значением.
STRING 8 "string" Считает пустую строку '' пустым значением.
ZERO 16 "zero" Считает строку, содержащую один символ нуля ('0') пустым значением.
EMPTY_ARRAY 32 "array" Считает пустой массив пустым значением.
NULL 64 "null" Считает null пустым значением.
PHP 127 "php" Считает значение пустым, если PHP-функция empty() вернет для него true.
SPACE 128 "space" Считает строку, содержащую только пробелы, пустым значением.
OBJECT 256 "object" Возвращает true. false возвращается, когда переданный объект не допустим.
OBJECT_STRING 512 "objectstring" Возвращает false, когда метод __toString() переданного объекта возвращает пустую строку.
OBJECT_COUNT 1024 "objectcount" Возвращает false, если переданный объект реализует интерфейс Countable, и его счетчик равен 0.
ALL 2047 "all" Считает все вышеперечисленные типы пустыми значениями.

Ниже показан пример кода, демонстрирующий использование валидатора NotEmpty.

<?php
use Zend\Validator\NotEmpty;

// Создаем экземпляр валидатора.
$validator = new NotEmpty();

// Настраиваем валидатор.
$validator->setType(NotEmpty::ALL);

// Проверяем, не является ли входное значение пустым.
$isValid1 = $validator->isValid('some string'); // возвращает true
$isValid2 = $validator->isValid(''); // возвращает false 
$isValid3 = $validator->isValid(0); // возвращает false

9.6.2.2. Валидатор Between

Валидатор Between проверяет, находится ли число в определенном диапазоне (min, max), либо включительно (по умолчанию), либо исключительно.

Public-методы, предоставляемые валидатором Between, перечислены в таблице 9.10:

Таблица 9.10. Public-методы валидатора Between
Имя метода Описание
__construct($options) Конструктор валидатора. Принимает список опций.
isValid($value) Возвращает true тогда и только тогда, когда значение лежит в заданном диапазоне.
getMessages() При неудачной валидации этот метод вернет массив сообщений об ошибках.
setMin($min) Задает нижнюю границу.
getMin() Извлекает нижнюю границу.
setMax($max) Задает верхнюю границу.
getMax() Извлекает верхнюю границу.
setInclusive($inclusive) Определяет, проверять ли нахождение значения в заданном диапазоне включительно.
getInclusive() Возвращает опцию проверки включительно.

Диапазон может быть задан с помощью методов setMin() и setMax().

По умолчанию, валидатор осуществляет сравнения включительно (чтобы проверить, принадлежит ли значение заданному диапазону, он сравнивает, значение больше или равно нижней границы или нет; и меньше или равно верхней границы или нет). Эту опцию можно изменить с помощью метода setInclusive(). Он сообщает валидатору, какое выполнять сравнение: включительно (для этого нужно передать аргумент true) или исключительно (аргумент false).

Ниже показан пример кода, демонстрирующий использование валидатора Between.

<?php
use Zend\Validator\Between;

// Создаем экземпляр валидатора.
$validator = new Between();

// Настраиваем валидатор.
$validator->setMin(1);
$validator->setMax(10);
$validator->setInclusive(true);

$isValid1 = $validator->isValid(5); // возвращает true.
$isValid2 = $validator->isValid(10); // возвращает true.
$isValid3 = $validator->isValid(0); // возвращает false (значение слишком мало).
$isValid4 = $validator->isValid(15); // возвращает false (значение слишком велико).

9.6.2.3. Валидатор InArray

Валидатор InArray проверяет, принадлежит ли входное значение заданному массиву значений. Public-методы, предоставляемые валидатором InArray, перечислены в таблице 9.11:

Таблица 9.11. Public-методы валидатора InArray
Имя метода Описание
__construct($options) Конструктор валидатора. Принимает список опций.
isValid($value) Возвращает true тогда и только тогда, когда значение принадлежит заданному массиву.
getMessages() При неудачной валидации этот метод вернет массив сообщений об ошибках.
setHaystack($haystack) Задает массив, где будем искать значение.
getHaystack() Возвращает массив допустимых значений.
setStrict($strict) Устанавливает режим строгой проверки.
getStrict() Включен ли режим строгой проверки?
setRecursive($recursive) Указывает валидатору осуществлять рекурсивный поиск.
getRecursive() Включен ли рекурсивный поиск?

Метод setHaystack() позволяет задать массив допустимых значений. Метод isValid() будет искать в этом массиве входную переменную $value`.

Если массив содержит вложенные значения, и вы хотите провести среди них рекурсивный поиск, используйте метод setRecursive(). Этот метод принимает один единственный булевый флаг. Если флаг установлен в true, поиск будет осуществляться рекурсивно; иначе вложенные уровни будут проигнорированы.

Метод setStrict() предоставляет возможность указать валидатору, каким образом будут сравниваться входное значение и значения в массиве. Он принимает комбинацию следующих констант:

Ниже показан пример кода, демонстрирующий использование валидатора InArray.

<?php
use Zend\Validator\InArray;

// Создаем экземпляр валидатора.
$validator = new InArray();

// Настраиваем валидатор.
$validator->setHaystack([1, 3, 5]);

// Perform validation.
$isValid1 = $validator->isValid(1); // возвращает true.
$isValid2 = $validator->isValid(2); // возвращает false.

9.6.2.4. Валидатор StringLength

Валидатор StringLength, принадлежит ли длина входной строки заданному диапазону (включительно). Он возвращает true тогда и только тогда, когда длина строки значения как минимум равна опции min и не больше опции max (если опция max не нулевая).

Public-методы, предоставляемые валидатором StringLength, перечислены в таблице 9.12:

Таблица 9.12. Public-методы валидатора StringLength
Имя метода Описание
__construct($options) Конструктор валидатора. Принимает список опций.
isValid($value) Возвращает true тогда и только тогда, когда длина значения лежит в заданном диапазоне.
getMessages() При неудачной валидации этот метод вернет массив сообщений об ошибках.
setMin($min) Задает нижнюю границу.
getMin() Извлекает нижнюю границу.
setMax($max) Задает верхнюю границу.
getMax() Извлекает верхнюю границу.
setEncoding($encoding) Устанавливает для использования новую кодировку.
getEncoding() Извлекает кодировку.

По умолчанию, валидатор StringLength считает действительной любую длину строки. Используйте методы setMin() и/или setMax(), чтобы задать нижнюю и верхнюю границу для допустимой длины. Существует три возможных способа это сделать:

По умолчанию, PHP-движок использует для строк кодировку UTF-8. Если входная строка использует другую кодировку, эту кодировку следует указать с помощью метода валидатора setEncoding().

Ниже показан пример кода, демонстрирующий использование валидатора StringLength.

<?php
use Zend\Validator\StringLength;

// Создаем экземпляр валидатора.
$validator = new StringLength();

// Настраиваем валидатор.
$validator->setMin(1);
$validator->setMax(10);

$isValid1 = $validator->isValid("string"); // возвращает true.
$isValid2 = $validator->isValid(""); // возвращает false (слишком короткое значение).
$isValid3 = $validator->isValid("a very long string"); // возвращает false (слишком длинное значение).

9.6.3. Организация валидаторов в цепь

Валидаторы могут быть организованы в последовательность. Это делается с помощью класса ValidatorChain. При запуске подобного составного валидатора, входное значение по очереди передается всем валидатором. Метод isValid() валидатора ValidatorChain возвращает true, если все валидаторы в цепочке возвращают true; иначе он возвращает false.

Класс ValidatorChain внутренне используется классом-контейнером InputFilter для хранения последовательности валидаторов, присоединенных к полю модели формы.

Public-методы, предоставляемые валидатором ValidatorChain, перечислены в таблице 9.12:

Таблица 9.13. Public-методы валидатора ValidatorChain
Имя метода Описание
isValid($value) Возвращает true, если все валидаторы в цепи возвращают true.
getMessages() Возвращает массив сообщений об ошибках валидации.
getValidators() Возвращает массив валидаторов в цепи.
count() Возвращает количество валидаторов в цепи.
attach($validator, $breakChainOnFailure) Добавляет валидатор в конец цепи.
prependValidator($validator, $breakChainOnFailure) Добавляет валидатор в начало цепи.
attachByName($name, $options, $breakChainOnFailure) Использует менеджер плагинов, чтобы добавить валидатор в конец по имени.
prependByName($name, $options, $breakChainOnFailure) Использует менеджер плагинов, чтобы добавить валидатор в начало по имени.
merge($validatorChain) Объединяет цепь валидаторов с цепью, переданной в качестве параметра.

Пример цепочки валидаторов показан на рисунке 9.2. Эта цепь состоит из валидатора NotEmpty, за которым следует валидатор StringLength, за которым в свою очередь следует валидатор Date. При выполнении этой цепи первым делом запускается валидатор NotEmpty, проверяющий, что значение не является пустым, затем StringLength, проверяющий, что длина входной строки принадлежит диапазону (1,16) включительно, и наконец валидатор Date`, проверяющий, что входное значение является датой в формате "ГГГГ-ММ-ДД".

Рисунок 9.2. Цепь валидаторов Рисунок 9.2. Цепь валидаторов

Для создания цепочки валидаторов, как на рисунке 9.2, используем следующий код:

<?php
// Инстанцируем цепь валидаторов.
$validator = new \Zend\Validator\ValidatorChain();

// Добавляем валидаторы в цепочку.
$validator->attachByName('NotEmpty');
$validator->attachByName('StringLength', ['min'=>1, 'max'=>16]);
$validator->attachByName('Date', ['format'=>'Y-m-d']);

// Выполняем все валидаторы в цепи.
$isValid = $validator->isValid('2014-04-04'); // Возвращает true.

9.6.4. Пользовательская валидация с помощью валидатора Callback

Валидатор Callback может быть оберткой для вашего собственного алгоритма валидации. Это может быть полезно, например, когда стандартные валидаторы не подходят, и вам нужно применить к данным свой алгоритм проверки. Public-методы, предоставляемые валидатором Callback перечислены в таблице 9.14.

Таблица 9.14. Public-методы валидатора Callback
Class name Описание
isValid($value, $context) Выполняет функцию обратного вызова в качестве валидатора.
getMessages() При неудачной валидации этот метод вернет массив сообщений об ошибках.
setCallback($callback) Устанавливает новый механизм обратного вызова.
getCallback() Возвращает установленный механизм обратного вызова.
setCallbackOptions($options) Задает параметры для механизма обратного вызова.
getCallbackOptions() Получает параметры механизма обратного вызова.

Как видите из таблицы, валидатор Callback предоставляет методы setCallback() и setCallbackOptions(), используемые для задания функции (или метода класса) обратного вызова и (опционально) передачи ей одного или нескольких параметров.

9.6.4.1. Пример

Чтобы продемонстрировать использование метода Callback, добавим валидатор телефонного номера к нашему классу модели формы ContactForm. Этот валидатор будет проверять номер телефона, вводимый посетителем сайта.

Валидатор должен делать проверку на два общепринятых формата телефонных номеров:

Так как ZF3 не предоставляет стандартного валидатора для осуществления подобной операции фильтрации номера, мы будем использовать валидатор-обертку Callback. Для этого внесем следующие изменения в код нашего класса ContactForm:

<?php
// ...
class ContactForm extends Form
{    
  // ..
  protected function addElements() {
    // ...
	
    // Добавляем поле "phone"
    $this->add([
        'type'  => 'text',
        'name' => 'phone',
        'attributes' => [                
          'id' => 'phone'
        ],
        'options' => [
          'label' => 'Your Phone',
        ],
      ]);
  }
    
  private function addInputFilter() 
  {
    // ...
        
    $inputFilter->add([
            'name'     => 'phone',
            'required' => true,                
            'validators' => [
                [
                  'name' => 'Callback',
                  'options' => [
                     'callback' => [$this, 'validatePhone'],
                     'callbackOptions' => [
                     'format' => 'intl'
                  ]
                ]                        
              ]                    
            ]
        );
  }
        
  // Пользовательский валидатор для телефонного номера.
  public function validatePhone($value, $context, $format) 
  {
    // Определяем корректную длину и шаблон телефонного номера 
    // в зависимости от формата.
    if($format == 'intl') {
      $correctLength = 16;
      $pattern = '/^\d\ (\d{3}\) \d{3}-\d{4}$/';
    } else { // 'local'
      $correctLength = 8;
      $pattern = '/^\d{3}-\d{4}$/';
    }
                
    // Проверяем длину номера.
    if(strlen($value)!=$correctLength)
      return false;

    // Проверяем, соответствует ли значение шаблону.
    $matchCount = preg_match($pattern, $value);
        
    return ($matchCount!=0)?true:false;
  }
}

Во фрагменте выше мы создаем поле phone в нашей форме обратной связи ContactForm (пропустите, если у вас уже есть такое поле).

В строках 26-40 мы добавляем в цепь валидаторов фильтра входных данных валидатор Callback для поля "phone".

В строках 44-64 находится метод обратного вызова validatePhone(). Этот метод принимает три аргумента: параметр $value - телефонный номер, который нужно валидировать, параметр $context, принимающий значения каждого поля формы (некоторым валидаторам нужно также обращаться к значениям других полей формы); и параметр $format - ожидаемый формат телефонного номера ("intl" или "local").

Внутри метода обратного вызова мы делаем следующее:

  1. Вычисляем корректную длину телефонного номера, проверяем, корректна ли длина для выбранного формата номера.
  2. Сопоставляем номер телефона с шаблоном регулярного выражения для выбранного формата номера.

Top