Yii - Xác thực Ad Hoc
Đôi khi bạn cần xác thực các giá trị không bị ràng buộc với bất kỳ mô hình nào. Bạn có thể dùngyii\base\DynamicModel lớp, hỗ trợ xác định cả thuộc tính và quy tắc một cách nhanh chóng.
Step 1 - Thêm actionAdHocValidation phương pháp cho SiteController.
public function actionAdHocValidation() {
$model = DynamicModel::validateData([ 'username' => 'John', 'email' => '[email protected]' ], [ [['username', 'email'], 'string', 'max' => 12], ['email', 'email'], ]); if ($model->hasErrors()) {
var_dump($model->errors);
} else {
echo "success";
}
}
Trong đoạn mã trên, chúng tôi xác định một “dynamic” mô hình với tên người dùng và thuộc tính email và xác nhận chúng.
Step 2 - Loại http://localhost:8080/index.php?r=site/ad-hoc-validation trên thanh địa chỉ của trình duyệt web, bạn sẽ thấy thông báo lỗi vì email của chúng tôi dài 14 ký tự.
Trình xác thực tùy chỉnh
Có hai loại trình xác thực tùy chỉnh -
- Trình xác thực nội tuyến
- Trình xác thực độc lập
Trình xác thực nội tuyến được xác định bởi một phương pháp mô hình hoặc một hàm ẩn danh. Nếu một thuộc tính không xác thực được, bạn nên gọiyii\base\Model::addError() phương pháp để lưu thông báo lỗi.
Ví dụ sau về RegistrationForm xác thực tài sản thành phố, vì vậy nó chỉ có thể chấp nhận hai giá trị - London và Paris.
<?php
namespace app\models;
use Yii;
use yii\base\Model;
class RegistrationForm extends Model {
public $username;
public $password; public $email;
public $country; public $city;
public $phone; public function rules() { return [ ['city', 'validateCity'] ]; } public function validateCity($attribute, $params) { if (!in_array($this->$attribute, ['Paris', 'London'])) { $this->addError($attribute, 'The city must be either "London" or "Paris".');
}
}
}
?>
Trình xác thực độc lập mở rộng yii\validators\Validatorlớp học. Để triển khai logic xác thực, bạn nên ghi đèyii\validators\Validator::validateAttribute() phương pháp.
Step 1 - Để triển khai ví dụ trước bằng trình xác thực độc lập, hãy thêm CityValidator.php nộp vào components thư mục.
<?php
namespace app\components;
use yii\validators\Validator;
class CityValidator extends Validator {
public function validateAttribute($model, $attribute) { if (!in_array($model->$attribute, ['Paris', 'London'])) { $this->addError($model, $attribute, 'The city must be either "Paris"
or "London".');
}
}
}
?>
Step 2 - Sau đó, sửa đổi RegistrationForm mô hình theo cách này.
<?php
namespace app\models;
use app\components\CityValidator;
use Yii;
use yii\base\Model;
class RegistrationForm extends Model {
public $username; public $password;
public $email; public $country;
public $city; public $phone;
public function rules() {
return [
['city', CityValidator::className()]
];
}
}
?>