热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

yii2自定义的validator为何不执行呢?:这个是登录表单模型classLoginFormextendsModel{public$account;public$passwor
这个是登录表单模型

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 || $len<$this->minLen) { 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 || $len<$this->minLen) { 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字符串。不知道这个是怎么回事?

我知道可以通过行内验证器可以达到这样的目的,但我想问下这里的情况是怎么回事?为何这里的验证方法不执行呢?

  1. Validator::validateAttribute() 与 Validator::validateValue() 是两种实现方式, 你用混了

  2. 仔细看文档

  3. 调试可以用 Yii::log()


推荐阅读
  • 在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板
    本文介绍了在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板的方法和步骤,包括将ResourceDictionary添加到页面中以及在ResourceDictionary中实现模板的构建。通过本文的阅读,读者可以了解到在Xamarin XAML语言中构建控件模板的具体操作步骤和语法形式。 ... [详细]
  • vue使用
    关键词: ... [详细]
  • 20211101CleverTap参与度和分析工具功能平台学习/实践
    1.应用场景主要用于学习CleverTap的使用,该平台主要用于客户保留与参与平台.为客户提供价值.这里接触到的原因,是目前公司用到该平台的服务~2.学习操作 ... [详细]
  • 后台获取视图对应的字符串
    1.帮助类后台获取视图对应的字符串publicclassViewHelper{将View输出为字符串(注:不会执行对应的ac ... [详细]
  • 拥抱Android Design Support Library新变化(导航视图、悬浮ActionBar)
    转载请注明明桑AndroidAndroid5.0Loollipop作为Android最重要的版本之一,为我们带来了全新的界面风格和设计语言。看起来很受欢迎࿰ ... [详细]
  • Android开发实现的计时器功能示例
    本文分享了Android开发实现的计时器功能示例,包括效果图、布局和按钮的使用。通过使用Chronometer控件,可以实现计时器功能。该示例适用于Android平台,供开发者参考。 ... [详细]
  • Go GUIlxn/walk 学习3.菜单栏和工具栏的具体实现
    本文介绍了使用Go语言的GUI库lxn/walk实现菜单栏和工具栏的具体方法,包括消息窗口的产生、文件放置动作响应和提示框的应用。部分代码来自上一篇博客和lxn/walk官方示例。文章提供了学习GUI开发的实际案例和代码示例。 ... [详细]
  • iOS超签签名服务器搭建及其优劣势
    本文介绍了搭建iOS超签签名服务器的原因和优势,包括不掉签、用户可以直接安装不需要信任、体验好等。同时也提到了超签的劣势,即一个证书只能安装100个,成本较高。文章还详细介绍了超签的实现原理,包括用户请求服务器安装mobileconfig文件、服务器调用苹果接口添加udid等步骤。最后,还提到了生成mobileconfig文件和导出AppleWorldwideDeveloperRelationsCertificationAuthority证书的方法。 ... [详细]
  • 纠正网上的错误:自定义一个类叫java.lang.System/String的方法
    本文纠正了网上关于自定义一个类叫java.lang.System/String的错误答案,并详细解释了为什么这种方法是错误的。作者指出,虽然双亲委托机制确实可以阻止自定义的System类被加载,但通过自定义一个特殊的类加载器,可以绕过双亲委托机制,达到自定义System类的目的。作者呼吁读者对网上的内容持怀疑态度,并带着问题来阅读文章。 ... [详细]
  • 本文介绍了Oracle存储过程的基本语法和写法示例,同时还介绍了已命名的系统异常的产生原因。 ... [详细]
  • 本文介绍了一款名为TimeSelector的Android日期时间选择器,采用了Material Design风格,可以在Android Studio中通过gradle添加依赖来使用,也可以在Eclipse中下载源码使用。文章详细介绍了TimeSelector的构造方法和参数说明,以及如何使用回调函数来处理选取时间后的操作。同时还提供了示例代码和可选的起始时间和结束时间设置。 ... [详细]
  • Gitlab接入公司内部单点登录的安装和配置教程
    本文介绍了如何将公司内部的Gitlab系统接入单点登录服务,并提供了安装和配置的详细教程。通过使用oauth2协议,将原有的各子系统的独立登录统一迁移至单点登录。文章包括Gitlab的安装环境、版本号、编辑配置文件的步骤,并解决了在迁移过程中可能遇到的问题。 ... [详细]
  • 本文详细介绍了Android中的坐标系以及与View相关的方法。首先介绍了Android坐标系和视图坐标系的概念,并通过图示进行了解释。接着提到了View的大小可以超过手机屏幕,并且只有在手机屏幕内才能看到。最后,作者表示将在后续文章中继续探讨与View相关的内容。 ... [详细]
  • Servlet多用户登录时HttpSession会话信息覆盖问题的解决方案
    本文讨论了在Servlet多用户登录时可能出现的HttpSession会话信息覆盖问题,并提供了解决方案。通过分析JSESSIONID的作用机制和编码方式,我们可以得出每个HttpSession对象都是通过客户端发送的唯一JSESSIONID来识别的,因此无需担心会话信息被覆盖的问题。需要注意的是,本文讨论的是多个客户端级别上的多用户登录,而非同一个浏览器级别上的多用户登录。 ... [详细]
  • 带添加按钮的GridView,item的删除事件
    先上图片效果;gridView无数据时显示添加按钮,有数据时,第一格显示添加按钮,后面显示数据:布局文件:addr_manage.xml<?xmlve ... [详细]
author-avatar
季末-心愫如弦
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有