Часто возникает необходимость провалидировать какие-то данные пришедшие извне, но для которых нет модели. Так как валидация в yii это неотъемлемая часть модели, а на каждый чих делать отдельный класс не хотелось, мне пришлось написать небольшой класс который решил для меня эту проблему:
<?php
class Validator extends CModel
{
private $_rules = [];
function __construct(array $rules = [])
{
$this->_rules = $rules;
}
public function __set($name, $value)
{
$setter = 'set' . $name;
if (method_exists($this, $setter)) {
return $this->$setter($value);
}
return $this->$name = $value;
}
public function __get($name)
{
$getter = 'get' . $name;
if (method_exists($this, $getter)) {
return $this->$getter();
}
return null;
}
public function attributeNames()
{
return $this->getSafeAttributeNames();
}
public function rules()
{
return $this->_rules;
}
}
Как видите получилось очень просто - в конструкторе задаем набор правил, который потом возвращается в методе rules
. Обратите внимание на метод attributeNames
- так как при определении класса мы не можем знать как будут называться атрибуты модели, то мы просто берем их название из переданного набора правил. К тому же пришлось переопределить методы __get
и __set
чтобы разрешить задавать любые значения для объекта, в противном случае при любой попытке задать любое свойство кидался бы эксепшен Property "Validator.<propertyname>" is not defined.
.
Использовать этот валидатор очень просто:
$v = new Validator([
['amount', 'required'],
]);
$v->attributes = [
'amount' => 100,
];
var_dump($v->validate());