Правила валидации
Когда данные модели, получены от конечных пользователей, они должны быть проверены, для того чтобы убедиться, что данные удовлетворяют определенным правилам (так называемым правилам валидации также известными как бизнес-правила). Например, дана модель ContactForm
, возможно Вы захотите убедиться, что все атрибуты являются не пустыми значениями, а атрибут email
содержит допустимый адрес электронной почты. Если значения нескольких атрибутов не удовлетворяют соответствующим бизнес-правилам, то должны быть показаны соответствующие сообщения об ошибках, чтобы помочь конечному пользователю исправить допущенные ошибки.
Вы можете вызвать [[yii\base\Model::validate()]] для проверки полученных данных. Данный метод будет использовать правила валидации определённые в [[yii\base\Model::rules()]] для проверки каждого соответствующего атрибута. Если ошибок не найдено, то возвращается true
, в противном случае возвращается false
, а ошибки содержит свойство [[yii\base\Model::errors]]. Например,
$model = new \app\models\ContactForm;
// модель заполнения атрибутов данными, вводимыми пользователем
$model->attributes = \Yii::$app->request->post('ContactForm');
if ($model->validate()) {
// все данные верны
} else {
// проверка не удалась: $errors - это массив содержащий сообщения об ошибках
$errors = $model->errors;
}
Объявляем правила валидации связанные с моделью, переопределяем метод [[yii\base\Model::rules()]] возврата правил атрибутов модели которые следует удовлетворить. В следующем примере показаны правила проверки объявленные в модели ContactForm
:
public function rules()
{
return [
// name, email, subject и body атрибуты обязательны
[['name', 'email', 'subject', 'body'], 'required'],
// атрибут email должен быть правильным email адресом
['email', 'email'],
];
}
Правило может использоваться для проверки одного или нескольких атрибутов, также и атрибут может быть проверен одним или несколькими правилами. Пожалуйста, обратитесь к разделу Проверка входных значений для более подробной информации о том, как объявлять правила проверки.
Иногда необходимо, чтобы правила применялись только в определенных сценариях. Чтобы это сделать необходимо указать свойство on
в правилах, следующим образом:
public function rules()
{
return [
// username, email и password требуются в сценарии "register"
[['username', 'email', 'password'], 'required', 'on' => self::SCENARIO_REGISTER],
// username и password требуются в сценарии "login"
[['username', 'password'], 'required', 'on' => self::SCENARIO_LOGIN],
];
}
Если не указать свойство on
, то правило применяется во всех сценариях. Правило называется активным правилом если оно может быть применено в текущем сценарии [[yii\base\Model::scenario|scenario]].
Атрибут будет проверяться тогда и только тогда если он является активным атрибутом объявленным в scenarios()
и связанным с одним или несколькими активными правилами, объявленными в rules()
.