您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息

yii2自定义的validator为何不执行呢?

2026/2/11 20:29:29发布7次查看
这个是登录表单模型
class loginform extends model{ public $account; public $password; /** * @return array the validation rules. */ public function rules() { return [ ['account','app\components\namevalidator','maxlen'=>12] ]; }}

app\components\namevalidator是我自定义的一个验证器:
namespace app\components;use yii\validators\validator;class namevalidator extends validator{ public $minlen=2; public $maxlen=14; public $charset='utf-8'; public $message; public function validatevalue($value) { file_put_contents('hello.txt','123');//测试方法是否执行。 $enpattern='/[a-z]/i'; $zhpattern='/^[\x{4e00}-\x{9fa5}]*$/u'; $valid=false; $zhstr=preg_replace($enpattern,'',$value,-1,$count); $enlen=$count; $zhlen=mb_strlen($zhstr,$this->charset); $len=$enlen+$zhlen*2; if($len>$this->maxlen || $lenminlen) { if(!$this->message)$this->message='字符数不正确'; }else if(!preg_match($zhpattern,$zhstr)) { if(!$this->message)$this->message='字符不合格'; }else{ $valid=true; } return $valid ? null : [$this->message,[]]; }}

在passportcontroller中调用loginform的validate方法进行验证:
namespace app\controllers;use yii;use yii\web\controller;use app\models\loginform;class passportcontroller extends controller{ public $enablecsrfvalidation=false; public $layout='@app/views/passport/main.php'; public function actionlogin() { if(\yii::$app->request->ispost) { $login=new loginform(); $login->load(\yii::$app->request->post()); if($login->validate()) { echo 'valid pass'; }else{ echo $login->errors; } } $this->view->title='登录'; return $this->render('login'); }}

结果就是我自定义的app\components\namevalidator类中的validatevalue方法并没有执行,在actionlogin方法中执行$login->validate()时总是输出valid pass字符串。不知道这个是怎么回事?
我知道可以通过行内验证器可以达到这样的目的,但我想问下这里的情况是怎么回事?为何这里的验证方法不执行呢?
回复内容: 这个是登录表单模型
class loginform extends model{ public $account; public $password; /** * @return array the validation rules. */ public function rules() { return [ ['account','app\components\namevalidator','maxlen'=>12] ]; }}

app\components\namevalidator是我自定义的一个验证器:
namespace app\components;use yii\validators\validator;class namevalidator extends validator{ public $minlen=2; public $maxlen=14; public $charset='utf-8'; public $message; public function validatevalue($value) { file_put_contents('hello.txt','123');//测试方法是否执行。 $enpattern='/[a-z]/i'; $zhpattern='/^[\x{4e00}-\x{9fa5}]*$/u'; $valid=false; $zhstr=preg_replace($enpattern,'',$value,-1,$count); $enlen=$count; $zhlen=mb_strlen($zhstr,$this->charset); $len=$enlen+$zhlen*2; if($len>$this->maxlen || $lenminlen) { if(!$this->message)$this->message='字符数不正确'; }else if(!preg_match($zhpattern,$zhstr)) { if(!$this->message)$this->message='字符不合格'; }else{ $valid=true; } return $valid ? null : [$this->message,[]]; }}

在passportcontroller中调用loginform的validate方法进行验证:
namespace app\controllers;use yii;use yii\web\controller;use app\models\loginform;class passportcontroller extends controller{ public $enablecsrfvalidation=false; public $layout='@app/views/passport/main.php'; public function actionlogin() { if(\yii::$app->request->ispost) { $login=new loginform(); $login->load(\yii::$app->request->post()); if($login->validate()) { echo 'valid pass'; }else{ echo $login->errors; } } $this->view->title='登录'; return $this->render('login'); }}

结果就是我自定义的app\components\namevalidator类中的validatevalue方法并没有执行,在actionlogin方法中执行$login->validate()时总是输出valid pass字符串。不知道这个是怎么回事?
我知道可以通过行内验证器可以达到这样的目的,但我想问下这里的情况是怎么回事?为何这里的验证方法不执行呢?
validator::validateattribute() 与 validator::validatevalue() 是两种实现方式, 你用混了
仔细看文档
调试可以用 yii::log()
该用户其它信息

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录 Product