validation - Yii2:独立验证不触发客户端验证
问题描述
验证功能不起作用。验证海关规则不适用于该usernmane
字段
module dektrium/user
PHP 7.1
Yii 2.0.16
已经从这里尝试了所有:https ://www.yiiframework.com/doc/guide/2.0/en/input-validation (内联验证器和独立验证器)
模型代理:
class Agent extends Profile
{
public $username;
public $password;
public $password2;
public function rules()
{
$rules = [
['username', AgentValidator::className()],// it's not work
[['email'], 'email'], // it's work
['password2', 'compare', 'compareAttribute' => 'password', 'message' => 'Пароли должны совпадать'],//// it's work
];
return array_merge(parent::rules(), $rules);
}
}
代理验证器.php
<?php
namespace app\components;
use yii\validators\Validator;
class AgentValidator extends Validator
{
public function validateAttribute($model, $attribute)
{
if (User::findOne(['username' => $this->$attribute]]) {
$this->addError($attribute, 'Такой логин уже занят');
}
}
}
解决方案
您正在使用独立验证器,并且您希望前端验证与后端一起工作,因此您需要覆盖yii\validators\Validator::clientValidateAttribute()
独立验证器中的AgentValidator
,它返回一段在客户端执行验证的 JavaScript 代码。
在 JavaScript 代码中,您可以使用以下预定义变量:
attribute
:正在验证的属性的名称。value
: 被验证的值。messages
:用于保存属性验证错误消息的数组。deferred
:可以将延迟对象推入的数组。
您可以通过实施客户端验证部分详细阅读。
除了上面列出的所有内容之外,您的验证器代码中存在错误User::findOne(['username' => $this->$attribute]]
,您需要使用$model->$attribute
而不是$this->$attribute
永远不会获得表单中输入的确切值。您可能错误地从模型中添加了它。
您当前的验证器应如下所示
<?php
namespace app\components;
use yii\validators\Validator;
class AgentValidator extends Validator
{
public $message='Такой логин уже занят';
public function validateAttribute($model, $attribute)
{
if (User::findOne(['username' => $model->$attribute])!==null)
{
$model->addError($attribute, $this->message);
}
}
public function clientValidateAttribute($model, $attribute, $view) {
//check if user exists
$userExists = User::findOne(['username' => $model->$attribute])!==null;
$message = json_encode($this->message, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE);
return <<<JS
if($userExists){
messages.push($message);
return;
}
JS;
}
}
推荐阅读
- python - python matplotlib.pyplot 在流式传输时截断数据
- python - 使用回调插件重试 ansible 失败的任务
- mongodb - 如何在本地主机上将 web2py 与 mongodb 连接?
- amazon-web-services - 将机密管理器密码短语导入内部函数 Fn::Sub:
- javascript - 如何在同一分钟内进行相同的聊天隐藏用户名
- android - 为什么我的 LottieView 动画在第一个循环时会闪烁?
- c# - Response.Redirect 将绝对 URL 转换为相对 URL
- c# - 有什么方法可以将焦点放在 Windows 窗体中的关闭、最小化和最大化图标上?
- hyperledger-fabric - 不同的世界状态数据库作为数据安全机制
- linux - 如何在 ubuntu 的 /etc/apt/sources.list 和 etc/apt/sources.list.d/ 中删除所有 repos?