NB! This project is archived thus not maintained anymore
A little framework for user input validation. It is still in development, so keep an eye on commits. Inspired by Yii2 input validation implementation.
You need PHP 5.4 to run this code.
After downloading source, add next code to file, where you data is going to be validated:
require 'valify/Validator.php';
$validator = new Validator();
Framework uses namespaces, so add next line to the top of file, where validator is called:
use valify\Validator;
There is also a more straightforward way to install this framework through the compser. In your project root, issue next command in terminal:
php composer.phar require xphoenyx/valify 1.*
Now you are ready to validate your data.
You can implement your own methods in base model class. Please investigate an example below:
use valify\Validator;
class Model {
/* ... */
protected $validator;
// Your rules
public $rules = [];
// Here is stored $_POST, for example
public $data = [];
function __construct() {
/* ... */
$this->validator = new Validator();
/* ... */
}
/*
* Your other methods
*/
public function validate() {
return $this->validator
->setRules($this->rules)
->loadData($this->data)
->validate();
}
public function getErrors() {
return $this->validator->getErrors();
}
}
Usage is similar to Yii2 input validation.
$rules = [
[['username', 'password'], 'string', 'max'=>10],
['email', 'email', 'message'=>'Please provide a valid email'],
['remember_me', 'boolean']
/* ... */
];
Each validator accepts message
parameter, which should contain an error message as string.
You can access attribute name and its value in message
by using so-called 'patterns':
['email', 'email', 'message'=>'{value} for attribute "{attribute}" is not a valid email'],
NB! If the value is not representable as a string, value type will be shown instead of value itself
You can also implement your own validators by extending valify\validator\AbstractValidator
class.
In this case, if you are not using composer autoloader, you should also import (require) AbstractValidator.
To use own validator in rules, just define validator namespace as a validator name:
$rules = [
/* ... */
['email', '\\examples\\ExampleValidator', 'ownProperty'=>'abc' /* ... */]
/* ... */
];
Make sure your validator is loaded before defining a namespace in rules.
Refer to the valify\validators\ExampleValidator
for detailed implementation info.
Input data is expected in next format:
$data = [
'username'=>'username',
'password'=>'123qwe',
'email'=>'[email protected]',
'remember_me'=>'1',
/* ... */
];
$validator = new Validator();
$validator = $validator->setRules($rules)->loadData($data)
You can call setrules()
and loadData()
multiple times:
$validator = new Validator();
$validator = $validator
->setRules([...])
->loadData([...])
->setRules([...])
->setRules([...])
->loadData([...])
->loadData([...]);
$isValid = $validator->validate();
You have an ability to perform a single value validation, without calling setRules()
and loadData()
:
$password = $_POST['password'];
$isValid = Validator::validateFor('string', $password, ['min'=>6, 'max'=>20]);
For multiple value validation, pass an array of desired values as a second argument:
$values = [
$_POST['username'],
$_POST['first_name'],
$_POST['password'],
];
$isValid = Validator::validateFor('string', $values, ['min'=>3, 'max'=>30]);
validateFor()
will return an object with two properties:
isValid
- contains boolean value;lastError
- contains last validation error message;errors
- contains whole error message stack for validating attribute;
if($validator->hasErrors()) {
$errorMsgs = $validator->getErrors();
}
You can also get an error message of a single attribute:
$errorMsgForUserAttr = $validator->getError('username');
As each attribute can have a few error messages, getError()
will give you
the last message of the corresponding attribute error stack (array).
- boolean
- file
- required
- string
- url
- phone
- in
- number
- compare
- unique
For detailed parameter description of each validator, see class methods in valify/validators.
In order to properly run unit tests, you need to specify path to the composer autoloader file.
Then you just issue the phpunit
command in terminal under valify
(component root) directory.
Check index.php in examples
directory to view framework in action.
All bug and issue reports are welcome as well as improvement proposals. Enjoy.