Yii2 验证器

公司有个项目我负责做接口 学个新的框架的的话有点耗时间 就用yii 来完成(毕竟公司项目用的就是yii)

此时就想吐槽两句 这个文档写的真的是深奥 我看了好久呀 可能也是我阅读能力有问题 所以很费劲 中间还找了智哥 才得以完成 有点惭愧 工作一年了还问人  有点丢人

言归正传 yii验证

这是文档的描述 为了害怕图片看不清楚 我把代码直接贴出来

$model = new \app\models\ContactForm(); // 根据用户的输入填充到模型的属性中
$model->load(\Yii::$app->request->post());
// 等效于下面这样:   $model->attributes = \Yii::$app->request->post('ContactForm'); 
if ($model->validate()) {
// 所有输入通过验证
} else {
// 验证失败: $errors 是一个包含错误信息的数组  $errors = $model->errors;
}

我先解释下 其实重点看这个里

// 根据用户的输入填充到模型的属性中
$model->load(\Yii::$app->request->post()); // 等效于下面这样:
// $model->attributes = \Yii::$app->request->post('ContactForm');
//敲黑板  等效于   这样的话可以看出如果我用 lode方法就是在post('模型名') 所以一点要注意
//实际开发我还是用的 $model->attributes = \Yii::$app->request->post('ContactForm'); 简单易懂

其次要在模型里重写rule方法这个文档有提到

public function rules()
{
    return [
        // name,email,subject 和 body 特性是 `require`(必填)的
        [['name', 'email', 'subject', 'body'], 'required'],

        // email 特性必须是一个有效的 email 地址
        ['email', 'email'],
    ];
}

贴一个我写的验证规则

public function rules() { 
    return [
            // name,email,subject 和 body 特性是 `require`(必填)的
            [['name', 'email', 'subject', 'body'], 'required'],
            // 相当于简洁写法 表示这些字段都必须填 不过我不喜欢 我喜欢自定义错误  所以我不喜欢这种写法 
            // email 特性必须是一个有效的 email 地址 
            ['email', 'email'],//todo 注意第二个email 是核心验证器 名字起这个而已验证邮箱格式的 
        ];
    }

其中的一些比如 'required' 'match' 啥的在文档中有就不一一描述  我贴一个链接

 yii2的核心验证器(戳他)
类似这种报错

补充

use yii\db\ActiveRecord; 模型要继承这个类 不然你继承modles类的话有个问题就是你要定义属性 这太麻烦了

举个例子  这种报错 Setting unknown property: app\models\Personal::username

Yii2 验证器
解决办法

//我以自己的模型举例
class Personal extends Model
{
  public $username;
....

场景

这是验证的另外一个概念 举个例子如果不定义场景就是全局的定义场景也很简单

class Personal extends Model{
        const SCENARIO_PERSONAL = 'personal';
//重写scenarios方法 
        public function scenarios()
        {
            return [
                self::SCENARIO_PERSONAL => ['username', 'tel', 'sex', 'birthday','addr'],//这个写法只是为了看起来舒服
                //'personal' =>['username', 'tel', 'sex', 'birthday','addr'], 等价
            ];
        }   
    }

传入场景的方式又两种

// 场景作为属性来设置
$model = new User;
$model->scenario = 'login';

// 场景通过构造初始化配置来设置
$model = new User(['scenario' => 'login']);

我在这里就复制文档的了 详细了解的话 yii场景(戳我)

其次就是遇到的问题就是 在中途遇到 Response content must not be an array. 

//因为响应格式默认为 HTML,只需要在操作方法中返回一个字符串, 如果想使用其他响应格式,应在返回数据前先设置格式, 例如:

public function actionInfo()
{
    \Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
    return [
        'message' => 'hello world',
        'code' => 100,
    ];
}

简单理解就是我返回的数据

return ['code'=>3, 'message'=>$errors];
//这是我返回的数据 总不能给客户端返回一个数组吧? (我以为自己会转成json....看来我想多了)

在要输出的代码之前 加上\Yii::$app->response->format = \yii\web\Response::FORMAT_JSON; 即可

本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 2

可以用gii生成数据模型,操作就会方便很多

4年前 评论

我已经稀里哗啦了

1年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!