yii2新版的rules验证笔记 [ 2.0 版本 ]
个人博文
请访问:诗意的边缘
或者直接访问 http://www.alan51.com
例子用于记录自己学习yii2的一些记录
控制器代码
[代码]
<?php
namespace app\modules\manage\controllers\api;
use app\modules\manage\models\Course;
use yii;
class CourseController extends BaseController
{
/**
* 课程列表
*
* @author Alan51
* @access public
* @since 1.0
* @return array
*/
public function actionItems()
{
$nickname = Yii::$app->request->get('name', '');
$model = new Course();
$page = Yii::$app->request->get('page', '');
$data = $model->itemsCourse($nickname, $page);
return $this->prompt(200, '成功', $data);
}
/**
* 编辑课程
* @author Alan51
* @access public
* @since 1.0
* @return array
*/
public function actionEdit()
{
$model = Course::find()->andWhere(['id'=>Yii::$app->request->post('id')])->one();
$model->setScenario('update');
if($model->load(Yii::$app->request->post(), '') && $model->validate()) {
$result = $model->save(false);
if($result) {
return $this->prompt(200, '成功', $result);
}
}
$model_error = $model->getFirstErrors();
if($model_error) {
$error = implode(' ', $model_error);
} else {
$error = '失败';
}
return $this->prompt(400, $error, $model_error);
}
/**
* 创建课程
* @author Alan51
* @access public
* @since 1.0
* @return array
*/
public function actionAdd()
{
$teacher_model = new Course();
$teacher_model->setScenario('create');
if($teacher_model->load(Yii::$app->request->post(), '') && $teacher_model->validate()) {
$result = $teacher_model->save(false);
if($result) {
return $this->prompt(200, '成功', $result);
}
}
$error = $teacher_model->ReturnError();
return $this->prompt(400, $error['error_msg'], $error['error_arr']);
}
public function actionDelete()
{
$model = Course::find()->andWhere(['id'=>Yii::$app->request->post('id', '')])->one();
if($model) {
$ret = $model->delete();
if($ret) {
return $this->prompt(200, '成功', $ret);
}
}
return $this->prompt(400, '失败');
}
}
模型
[代码]
<?php
/**
* 文件名称: Course.php.
* 作者名称: Alan51
* 创建时间: 2016/4/22 13:57
*/
namespace app\modules\manage\models;
use yii\behaviors\TimestampBehavior;
use yii\db\ActiveRecord;
class Course extends ActiveRecord
{
public static function tableName()
{
return 'curriculum';
}
public function rules()
{
return [
[['teacher_id', 'name', 'price', 'address', 'class_time', 'limit_num', 'description'], 'required', 'message'=>"请输入{attribute}", 'on'=>['create', 'update']],
[['limit_num', 'teacher_id'], 'number', 'message'=>'请填入正确的{attribute}', 'on'=>['create', 'update']],
['class_time', 'compare_time', 'message'=>'{attribute}不能小于当前时间', 'on'=>['create', 'update']],
['limit_num', 'compare', 'compareValue'=>$this->use_num, 'operator'=>'>', 'message'=>'{attribute}不能大于已招人数,已招人数为:'.$this->use_num, 'on'=>'update'],
['description', 'safe']
];
}
public function compare_time($label) {
$time = $this->class_time;
if(is_int($time)) {
if($time < time()) {
$this->addError($label, '选择的时间不能小于当前时间');
}
} else {
$r = strtotime($time);
if (!$r) {
$this->addError($label, '请选择正确的时间');
}
if (strtotime($time)<time()) {
$this->addError($label, '选择的时间不能小于当前时间');
}
}
}
public function scenarios()
{
return [
'create'=>['teacher_id', 'name', 'price', 'address', 'class_time', 'limit_num', 'description', 'create_time', 'update_time'],
'update'=>['teacher_id', 'name', 'price', 'address', 'class_time', 'limit_num', 'description', 'update_time'],
];
}
public function behaviors()
{
return [
'timestamp'=>[
'class'=>TimestampBehavior::className(),
'attributes'=>[
ActiveRecord::EVENT_BEFORE_INSERT => ['create_time', 'update_time'],
ActiveRecord::EVENT_BEFORE_UPDATE => ['update_time']
]
]
];
}
public function attributeLabels()
{
return [
'teacher_id' => '老师',
'name' => '课程名',
'price' => '报名费用',
'address' => '上课地点',
'class_time' => '上课时间',
'limit_num' => '限招人数',
'description' => '描述'
];
}
public function afterValidate()
{
$this->class_time = strtotime($this->class_time);
}
public function ReturnError() {
$model_error = $this->getFirstErrors();
if($model_error) {
$error = implode(' ', $model_error);
} else {
$error = '失败';
}
return ['error_msg'=>$error, 'error_arr'=>$model_error];
}
/**
* 获取课程
* @author Alan51
* @access public
* @param string $name
* @param string $page
* @param int $limit
* @since 1.0
* @return array
*/
public function itemsCourse($name='', $page='', $limit=10) {
$model = $this->find();
if($name) {
$model->andWhere(['like', 'curriculum.name', $name]);
}
if(!$page) {
return $model->orderBy('create_time desc')
->all();
}
$count = $model->count();
$page_no = ($page - 1) * $limit;
$items = $model->orderBy('create_time desc')
->limit($limit)
->leftJoin('teacher', 'teacher.id=curriculum.teacher_id')
->select('curriculum.*,teacher.name as teacher_name')
->offset($page_no)
->asArray()
->all();
$data['items'] = $items;
$data['total'] = $count;
$data['page'] = ceil($count/$limit);
return $data;
}
/**
* 根据老师删除该老师的课程
* @author Alan51
* @access public
* @param $id
* @since 1.0
* @return array
*/
public function deleteCourseByTeacherId($id)
{
return $this->find()->createCommand()->delete($this->tableName(), ['teacher_id'=>$id])->execute();
}
}
***注意
有些验证类型不支持message,比如:
['mobile', 'string', 'min' => 11,'max' => 11,'tooShort'=>'{attribute}位数为11位','tooLong'=>'{attribute}位数为11位', 'on'=>['create', 'update']],
消息提示在tooShort和tooLong上面
scenarios是场景,在控制器中选择需要setScenarios进行选择,上面代码体现。
更多原文技术性的内容请访问我的博客:诗意的边缘 或者 访问:http://www.alan51.com
alan51
注册时间:2015-08-24
最后登录:2018-09-28
在线时长:8小时43分
最后登录:2018-09-28
在线时长:8小时43分
- 粉丝5
- 金钱125
- 威望60
- 积分805
共 1 条评论
有个问题想问下楼主 在做场景update 的时候 是需要用findOne 的 但是这个时候validate required 是不生效的 这个时候该怎么办 。难道要手动验证一些必填项吗 required