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
解决办法
//我以自己的模型举例
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 协议》,转载必须注明作者和本文链接
可以用gii生成数据模型,操作就会方便很多
我已经稀里哗啦了