Как то мне понадобилось сделать такую валидацию, что бы уникальными были не поля по отдельности, а комбинация полей.
Когда в контролер приходят данные из формы с ними надо что-то сделать — загрузить в соответствующую модель, проверить на валидность, как-нибудь так:
$model->load(Yii::$app->request->post());
$model->validate();
Важное замечание: при этом в модель загружаются только те поля (так называемые безопасные), для которых указаны валидация.
При создании в Yii форм, с наследованием от класса Model ( use yii\base\Model), правила валидации задаются функцией rules:
public $field1;
public $field2;
public function rules()
{
return [
[['field1', 'field2'], 'required'],
[['field1'], 'unique', 'targetAttribute' => ['field1', 'field12']]
];
}
в виде массива [[‘поле1’, ‘поле2’], ‘название валидатора’, параметры(опционально)]
В приведенном выше примере поля field1 и field2 — обязательны для заполнения, а поле field1 должно быть уникальным для данного field2.
(документация по валидатору unique)
Кроме встроенных валидаторов (соответствие различным типам переменных, проверка на изображение, файл, url, email и т.д.), есть возможность писать свои. Например:
public $field1;
public function rules()
{
return [
[['field1'], 'field1Validator', $params],
];
}
public function filterValidator($attr, $params) {
// проверка атрибута по произвольным правилам
// если он не прошел проверку, то к данному атрибуту добавляется ошибка:
$this->addError($attr, 'invalid, because...');
}