Это PHP-библиотека для выборки и проверки полей, а также хранения сообщений в различных контейнерах (включая ошибки, предупреждения, информацию и успех) в зависимости от условий.
Идеология этой библиотеки проста: 3 класса, простые зависимости и работает на PHP 7.1 и выше, поэтому ее можно запускать практически в любом проекте PHP, включая WordPress, Laravel, основной проект PHP и т. д.
Примеры
Учебная форма и таблица с PHP
Это пример функциональности. Типичный пример более сложен, даже если он состоит всего из нескольких строк кода.
Допустим, мы хотим проверить значение входного значения (получить) под названием «id», мы могли бы сделать следующее:
use eftec ValidationOne ;
$ val = new ValidationOne ();
$ r = $ val -> def ( ' ERROR ' )
-> type ( ' integer ' )
-> ifMissingThenDefault ()
-> condition ( " eq " , " It's not equals to 10 " , 10 )
-> condition ( " eq " , " It's not equals to 30 (info) " , 30 , ' info ' )
-> ifFailThenDefault ()
-> get ( ' id ' ); // <-- end of the chain
Но где ошибка? Сообщения хранятся в messageList.
var_dump ( $ val -> messageList -> allArray ()); // here we show all messages of any kind of type.
var_dump ( $ val -> messageList -> errorCount ); // returns the number of errors.
var_dump ( $ val -> errorcount ()); // returns the number of errors (alternative)
var_dump ( $ val -> hasError ()); // returns true if there is an error.
Однако мы также можем показывать сообщение по типу (ошибка, предупреждение...) и только сообщение по определенному идентификатору.
var_dump ( $ val -> messageList -> get ( ' id ' )-> allErrorOrWarning ()); // All error or warning contained in the key "id".
Почему сообщения хранятся в какой-то структуре? Разве не просто вернуть ошибку?
Ответ – это форма. Допустим, у нас есть форма с тремя полями. Если один из них не работает, то ошибка должна быть видна для каждого поля отдельно. Кроме того, вся форма может иметь собственное сообщение.
Начало цепочки обычно пишется в конце кода.
Разрешенные методы:
Пример:
$ val = new ValidationOne ();
$ id = $ val -> type ( ' integer ' )-> get ( ' id ' );
$ id = $ val -> type ( ' integer ' )-> post ( ' id ' );
$ id = $ val -> type ( ' integer ' )-> request ( ' id ' );
$ id = $ val -> type ( ' integer ' )-> set ( ' 123 ' , ' id ' );
$ val = new ValidationOne ();
$ id = $ val -> type ( ' integer ' )-> get ( ' id ' ); // $_GET['id']
$ val = new ValidationOne ( ' frm ' ); // we set a prefix for every reading.
$ id = $ val -> type ( ' integer ' )-> get ( ' id ' ); // $_GET['frm_id']
условие ($condition, $message = "", $conditionValue = null, $level = 'error', $key = null)
Он добавляет условие, что это зависит от типа ввода.
@param строка $условие
число :req,eq,ne,gt,lt,gte,lte,между,null,notnull
строка :req,eq,ne,minlen,maxlen,betweenlen,null,notnull,contain,notcontain ,alpha,alphanum,text,regexp,email,url,domain
дата :req,eq,ne,gt,lt,gte,lte,между
строка даты :req,eq,ne,gt,lt,gte,lte,между
логическое значение :req,eq,ne,true,false
файл : минимальный размер, максимальный размер, требование, изображение, документ, сжатие, архитектура, расширение
функция:
fn.static.Class.methodstatic
fn.global.function
fn.object.Class.method, где объект является глобальным $объектом
fn.class.Class.method
fn.class.пространство именКласс.метод
@param строка $сообщение
В сообщении могут использоваться следующие переменные: «%field», «%realfield», «%value», «%comp», «%first», «% Second».
Поле | Описание | Пример |
---|---|---|
%поле | имя поля, это может быть идентификатор друга или настоящее имя | идентификатор клиента |
%реалфилд | имя поля (не идентификатор друга ) | Идентификатор клиента |
%ценить | текущее значение поля | Джон |
% комп | значение для сравнения (если есть) | |
%первый | первое значение для сравнения (если значение сравнения является массивом) | |
%второй | второе значение для сравнения (если значение сравнения является массивом) | |
%ключ | используемый ключ (для входного массива) |
@param null $conditionValue
@param строка $level (ошибка, предупреждение, информация, успех). Уровень ошибки. См. MessageContainer для получения дополнительной информации.
@param string $key Если ключ не равен нулю, он используется для добавления более одного условия по ключу
@return ValidationOne
Примечание. Если значение равно нулю и isNullValid() имеет значение true, условия игнорируются. Если значение отсутствует и isMissingValid() имеет значение true, условия игнорируются. Если значение пусто ('') и isEmptyValid() имеет значение true, то условия игнорируются. Если значение пусто ('') или null и isNullOrEmptyValid() имеет значение true, то условия игнорируются. isNullValid(), isMissingValid(), isNullOrEmptyValid() и isEmptyValid() полезны, когда мы хотим проверить значение, только если оно существует или если значение установлено.
Пример:
$ validation -> def ( null )
-> type ( ' integer ' )
-> condition ( ' eq ' , ' %field %value is not equal to %comp ' , 50 )
-> condition ( ' eq ' , ' %field %value is not equal to %comp ' , 60 )
-> set ( ' aaa ' , ' variable2 ' );
тип | описание |
---|---|
целое число | (числовой) позволяет использовать число без десятичной дроби |
unixtime | (числовой) позволяет использовать число без десятичной дроби |
логическое значение | (логическое значение) хранит истину или ложь. Ввод может быть разным (пусто, ноль или ноль = ложь, в противном случае — правда). |
десятичный | (числовой) позволяет использовать число с десятичной дробью |
плавать | (числовой) позволяет использовать число с десятичной дробью |
варчар | (строка) позволяет любой ввод |
нить | (строка) позволяет любой ввод |
дата | (дата) входные данные могут быть DateTime или строкой. Значение сохраняется как объект DateTime. |
дата и время | (дата) входные данные могут быть DateTime или строкой. Значение сохраняется как объект DateTime. |
строка даты | (дата) входные данные могут быть DateTime или строкой. Значение сохраняется в виде строки |
строка даты и времени | (дата) входные данные могут быть DateTime или строкой. Значение сохраняется в виде строки |
файл | (файл) входные данные представляют собой строку и сохраняются как строка, но добавляются специальные проверки |
Тип входа | Состояние | |
---|---|---|
число | гт, лт, гте, лте, между | |
нить | минлен, макслен, междулен, содержать ,notcontain,альфа,буквенный,текст,регулярное выражение,электронная почта,url,домен | |
дата | гт, лт, гте, лте, между | |
строка даты | гт, лт, гте, лте, между | |
логическое значение | правда, ложь | |
файл | минимальный размер, максимальный размер, требование, изображение, документ, сжатие, архитектура, расширение | |
* (применяется для любого типа) | req,eq,ne,null,notnull,пустой,notempty | |
* | функция | |
* | fn.static.Class.methodstatic | |
* | fn.global.function | |
* | fn.object.Class.method где объект является глобальным $объектом | |
* | fn.class.Class.method | |
* | fn.class.пространство именКласс.метод |
Состояние | Описание | Пример значения |
---|---|---|
архитектура | Расширение файла должно быть файлом архитектуры (dwg и т. д.). | |
между | Число должно находиться между двумя значениями | [0,20] |
междулен | Длина текста должна находиться между двумя значениями. | [0,20] |
сжатие | Расширение файла должно быть сжатым файлом. | |
содержать | Текст должен содержать значение | "текст" |
док | Расширение файла должно быть файлом документа. | |
eq (это может быть массив или значение) / == | Значение должно быть равно Значение должно содержаться в массиве | "текст",["текст","текст2"] |
существовать | Файл или значение должны существовать (оно может быть нулевым/пустым). | |
отсутствует / не существует | Файл или значение не должны существовать или быть нулевыми/пустыми. | |
требуется (или требуется) | Значение не должно быть нулевым или пустым. | |
доб. | Расширение (файл) должно быть в списке расширений | ["ext1","ext2","ext3"] |
ЛОЖЬ | Значение должно быть ложным (===false) | |
fn.class.пространство именКласс.метод | Метод класса должен возвращать true | |
fn.class.Class.method | Метод класса должен возвращать true | |
fn.global.function | Глобальная функция должна возвращать true | |
fn.object.Class.method, где объект является глобальным $объектом | Метод глобального объекта должен возвращать true | |
fn.static.Class.methodstatic | Статический метод класса должен возвращать true | |
функция | Функция должна возвращать true | |
гт / > | Значение должно быть больше, чем | 123 |
гте / >= | Значение должно быть больше или равно | 123 |
изображение | Расширение файла должно быть файлом изображения. | |
л / < | Значение должно быть меньше | 123 |
лте / <= | Значение должно быть меньше или равно | 123 |
Макслен | Максимальная длина строки | 123 |
максимальный размер | Максимальный размер файла | 123 |
минлен | Минимальная длина строки | 123 |
минимизировать размер | Минимальный размер файла | 123 |
mime (значение для сравнения может быть строкой или массивом) | MIME-тип файла | "application/msword" или ["application/msword", "image/gif"] |
мимтип | MIME-тип (без подтипа) файла. | "приложение" или ["приложение,"изображение"] |
ne / != (значение для сравнения может быть одним значением или массивом) | Значение не должно быть равным. Или значение не должно содержаться в массиве | 123,[123,345],["аа","bb"] |
не содержать | Значение не должно содержать значения | "текст" |
ненулевой | Значение не должно быть нулевым | |
нулевой | Значение должно быть нулевым | |
пустой | Значение должно быть пустым (т.е. "",0,null). | |
пустой | Значение не должно быть пустым (т.е. не равно "",0,null) | |
требование | Значение должно существовать | |
истинный | Значение должно быть true (===true) |
Примеры:
$ validation -> def ( null )
-> type ( ' integer ' )
-> condition ( ' eq ' , ' %field %value is not equal to %comp ' , 50 )
-> condition ( ' between ' , ' %field %value must be between 1 and 50 ' ,[ 1 , 50 ])
-> condition ( ' eq ' , ' %field %value is not equal to %comp ' , 60 )
-> condition ( ' eq ' , ' %field %value is not equal to %comp ' ,[ 60 , 200 ]) // eq allows a single or array
-> condition ( ' fn.static.Example.customval ' , ' the function does not work ' )
-> condition ( ' req ' )
-> condition ( ' lt ' , " es muy grande " , 2000 , ' warning ' )
-> condition ( ' eq ' , ' %field %value is not equal to %comp ' , 50 )
-> condition ( ' fn.static.Example.fnstatic ' , ' the static function does not work ' )
-> condition ( ' fn.static.somespaceSomeclass.methodStatic ' , null )
-> condition ( ' fn.global.customval ' , ' The global function does not work ' )
-> condition ( ' fn.object.example.fnnostatic ' , ' the function object does not work ' )
-> condition ( ' fn.class.somespaceSomeclass.method ' , ' The function some class does not work ' )
-> condition ( ' fn.class.Example.fnnostatic ' , ' la funcion class no funciona ' );
// ->condition('fn.static.Example.customval','la funcion no funciona')
function customval ( $ value , $ compareValue ) {
return true ;
}
Иногда нам нужно использовать собственное условие. Мы могли бы создать глобальную переменную, статическую функцию или даже метод внутри класса.
Каждый созданный метод или функция должен иметь два параметра (с любым именем):
Например, что, если нам нужно проверить, не существует ли какой-либо идентификатор в базе данных?
$ validation -> condition ( ' fn.global.idExist ' , ' The id already exist! ' )-> get ( " id " );
function idExist ( $ id , $ compare = null ) {
// select count(*) c from table where id=$id
if ( $ c > 0 ) {
return true ;
} else {
return false ;
}
}
Примечание. Если нам нужно указать пространство имен, мы можем использовать обозначение: namespaceSomeClass.
$ validation -> condition ( ' fn.global.customfn ' ); // global
$ validation -> condition ( ' fn.static.SomeClass.staticfn ' ); // calling a static method inside the class SomeClass.
$ validation -> condition ( ' fn.class.SomeClass.noStaticFn ' ); // method inside a class,it creates an instance of an object then it calls the method
$ validation -> condition ( ' fn.object.myObject.noStaticFn ' ); // method inside a class, it uses an instance called $myObject
// global function
function customfn ( $ value , $ compareValue ) {
// returns true or false
}
// static function
$ myObject = new SomeClass ();
class SomeClass {
public static function staticfn ( $ value , $ compareValue ) {
// returns true or false
}
public function noStaticFn ( $ value , $ compareValue ) {
// returns true or false
}
}
Когда мы проверяем объект, он может хранить информацию внутри контейнера сообщений (также называемого списком сообщений).
Контейнер сообщений (EFTEC/MessageContainer) содержит список сообщений в иерархическом порядке:
Container (usually only 1 for all the project)
Lockers (from zero to many)
Messages (from zero to many and grouped by level)
$ container -> get ( ' locker20 ' )-> firstError (); // it returns the first message of error in the locker20 that is part of the container.
Сообщения ранжируются следующим образом
идентификатор | Описание | Пример |
---|---|---|
ошибка | Сообщение является ошибкой, и ее необходимо устранить. Это наша остановка шоу. | База данных не работает |
предупреждение | Сообщение является предупреждением, которое, возможно, можно проигнорировать. Однако класс MessageContainer позволяет группировать ошибки и предупреждения как одно и то же. | Реестр сохранился, но с предупреждениями |
информация | Сообщение – это информация. Например, для регистрации или отладки операции. | Журнал сохранен |
успех | Сообщение об успешной операции | Заказ принят |
Функция | Описание | Пример |
---|---|---|
addMessage($idLocker, $message, $level = 'ошибка') | Он добавляет сообщение внутри шкафчика. Обычно это делается библиотекой автоматически, но вы можете добавлять сообщения вручную с помощью кода. | $this->addMessage('pwd','требуется пароль','ошибка'); |
getMessage ($withWarning = ложь) | Он получает первое сообщение об ошибке или пустое, если его нет. | $this->getMessage(); |
getMessages ($withWarning = ложь) | Он получает все сообщения об ошибках или пуст, если их нет. | $this->getMessages(); |
getMessageId($idLocker) | Он получает объект MessageLocker (дополнительную информацию см. в разделе EFTEC/MessageContainer). | $obj=$this->getMessageId('pwd'); |
errorCount (includeWarning = false) | Он получает количество ошибок | $count=$this->errorCount(); |
hasError($includeWarning=false) | Возвращает true, если есть ошибка | $fail=$this->hasError(); |
Поле | Описание | Пример |
---|---|---|
$messageList | Он получает весь контейнер. Он возвращает объект типа MessageContainer. | $container=$this->messageList; |
Вы можете увидеть дополнительную информацию о MessageContainer в EFTEC/MessageContainer.
Пример:
$ validation -> addMessage ( ' idlocker ' , ' this field is required ' , ' error ' ); // it adds a message inside a locker.
$ validation -> messageList -> get ( ' idlocker ' )-> allError (); // it gets all errors from the locker idlocker
$ validation -> getMessages ( true ); // it gets all messages of error or warning from all the lockers.
Мы также могли работать с датами. Существует несколько типов форматов даты.
тип | описание |
---|---|
дата | (дата) входные данные могут быть DateTime или строкой. Значение сохраняется как объект DateTime. |
дата и время | (дата) входные данные могут быть DateTime или строкой. Значение сохраняется как объект DateTime. |
строка даты | (дата) входные данные могут быть DateTime или строкой. Значение сохраняется в виде строки с использованием поля $dateOutputString. |
строка даты и времени | (дата) входные данные могут быть DateTime или строкой. Значение сохраняется в виде строки с использованием поля $dateLongOutputString. |
Существует два способа указать формат дат: короткий (только дата) и длинный (дата и время). И мы могли бы указать формат как входной, так и выходной.
Поле имени | Описание | Значение по умолчанию |
---|---|---|
$dateShort | Это (ожидаемый) формат ввода даты (короткий). | д/м/г |
$dateLong | Это (ожидаемый) формат ввода (с датой и временем). | д/м/YH:i:s |
$dateOutputString | Это выходной формат (для строки даты) | Ymd |
$dateLongOutputString | Это выходной формат (для строки даты и времени). | YmdTH:i:sZ |
$ r = getVal ()-> type ( ' datestring ' )-> set ( ' 31-12-2019 ' ); // 2019-12-31 note: the default input value is d/m/Y, not m/d/Y
Мы можем изменить формат даты, изменив поля или вызвав следующие функции.
Установка формата дат (короткий ввод, длинный ввод, короткий вывод и длинный вывод)
$ validation -> setDateFormat ( ' m/d/Y ' , ' m/d/Y H:i:s ' , ' Y-m-d ' , ' Y-m-dTH:i:sZ ' )
Устанавливаем формат дат в конфигурацию по умолчанию
$ validation -> setDateFormatDefault ();
Мы устанавливаем формат дат:
Имя | Формат |
---|---|
вход короткий | м/д/г |
ввод длинный | м/д/YH:i:s |
выход короткий | Ymd |
вывод длинный | YmdTH:i:sZ |
$ validation -> setDateFormatEnglish ()
По умолчанию эта библиотека не генерирует исключений. Однако можно генерировать исключения, если сообщение имеет тип ОШИБКА и/или ПРЕДУПРЕЖДЕНИЕ.
При использовании этого метода, если контейнер генерирует ошибку, то при его сохранении также генерируется новое исключение.
Примечание. По умолчанию большинство сообщений имеют тип ОШИБКА.
Примечание. Когда оператор throw, значение не присваивается и стек удаляется, т. е. если мы выбрасываем исключение, вся информация теряется.
try {
$ validation -> type ( ' integer ' )
-> throwOnError () // for errors only
-> set ( ' hello ' , ' field1 ' );
// or you could use:
$ validation -> type ( ' integer ' )
-> throwOnError ( true , true ) // for errors and warnings
-> set ( ' hello ' , ' field1 ' );
$ this -> fail ( ' this value means the throw failed ' );
} catch ( Exception $ ex ) {
$ this -> assertEquals ( ' field1 is not numeric ' , $ ex -> getMessage ());
}
В этой библиотеке есть четыре разных способа работы с пустыми значениями.
$ validation -> exist ()-> set ( null ); // is valid.
$ validation -> exist ()-> set ( '' ); // is valid.
$ validation -> exist ()-> get ( ' field ' ); // is valid only if $_GET['field'] exist (even if it is null)
$ validation -> required ()-> set ( null ); // is not valid.
$ validation -> required ()-> set ( "" ); // is not valid.
$ validation -> required ()-> set ( ' hi ' ); // is valid.
$ validation -> notnull ()-> set ( null ); // is not valid.
$ validation -> notnull ()-> set ( "" ); // is valid.
$ validation -> notnull ()-> set ( ' hi ' ); // is valid.
$ validation -> notempty ()-> set ( null ); // is valid.
$ validation -> notempty ()-> set ( "" ); // is not valid.
$ validation -> notempty ()-> set ( ' hi ' ); // is valid.
Кроме того, существует 4 способа принятия пропущенных значений, нулевых или пустых, в обход любого условия.
$ validation -> isNullValid ()-> condition (... . )-> set ( null ); // is valid no matter the condition.
$ validation -> isNullorEmptyValid ()-> condition (... . )-> set ( null ); // is valid no matter the condition.
$ validation -> isEmptyValid ()-> condition (... . )-> set ( '' ); // is valid no matter the condition.
$ validation -> isMissingValid ()-> condition (... . )-> get ( ' field ' ); // If the field is missing, then is valid no matter the condition
Он используется, когда нам нужно проверить, имеет ли ввод какое-либо значение, если только значение не отсутствует, не пусто или не равно нулю.
isNullorEmptyValid() равен вызову: isEmptyValid()->isNullValid()
Кроме того, эти операторы могут быть сложены.
$ validation
-> isNullorEmptyValid ()
-> isMissingValid ()
-> condition (... . )
-> set (... . ); // this expression is valid if the value is null, empty(''), the value is missing, no matter the conditions.
Мы могли бы установить значение по умолчанию. Это значение может быть резервным в случае ошибки. Значение по умолчанию никогда не преобразуется и не обрабатывается.
$ validation
-> def (- 1 )
-> type ( ' integer ' )
-> ifFailThenDefault ()
-> set (...); // if the operation fails, then it returns -1
Обрезаем результат. По умолчанию результат не обрезается. Вы можете обрезать левую, правую или обе стороны. Для выполнения операции используется метод Convert().
$ validation -> trim ()-> set (... . ); // trim both sided
$ validation -> trim ( ' trim ' , ' ., ' )-> set (... . ); // trim . and ,
$ validation -> trim ( ' ltrim ' )-> set (... . ); // trim left sided
$ validation -> trim ( ' rtrim ' )-> set (... . ); // trim right sided
Иногда нам всегда хочется обрезать результаты. Таким образом, мы могли бы использовать этот метод, чтобы всегда обрезать результат. Он складывается в конце преобразования.