>  Q&A  >  본문

php - yii2 的model 执行流程是什么

之前在yii1里

提交数据是
$model->load()
$model->save()
比如我要把 date类型转为int类型
会在 beforesave()里 $this->date = time() 转换

但是在yii2里

beforeSave(){
$this->date = time()
}

会先走validate的 rule方法

就是说 没有进beforeSave转换之前就先执行了, 那beforeSave还有毛用了

大家讲道理大家讲道理2773일 전501

모든 응답(2)나는 대답할 것이다

  • 怪我咯

    怪我咯2017-04-10 15:54:53

    如果楼主是单纯想要给时间字段赋值,建议在模型里添加如下代码:

    phppublic function behaviors()
        {
            return [
                [
                    'class' => TimestampBehavior::className(),
                    'attributes' => [
                        ActiveRecord::EVENT_BEFORE_INSERT => ['created_at','updated_at'],
                        ActiveRecord::EVENT_BEFORE_UPDATE => 'updated_at'
                    ],
                ],
        }
    

    然后我再正面回答一下楼主问题,流程如下:

    flowst=>start: $model->save(runValidation)
    e=>end: 整个请求结束
    runValidation=>condition: runValidation?
    beforeValidate=>operation: beforeValidate
    validate=>operation: validate(rules在这儿执行)
    afterValidate=>operation: afterValidate
    beforeSave=>operation: beforeSave
    save=>operation: save
    afterSave=>operation: afterSave
    
    st->runValidation
    runValidation(yes,right)->beforeValidate
    runValidation(no)->beforeSave
    beforeValidate->validate->afterValidate(left)->beforeSave
    beforeSave->save->afterSave->e
    

    我勒个去,为了画这个流程图,我专门去看了下markdown的流程图语法。。。一晚上时间就白费了。。。楼主,你要负责

    회신하다
    0
  • 怪我咯

    怪我咯2017-04-10 15:54:53

    这样写试试:

    public function beforeSave($insert)
    {
        if (parent::beforeSave($insert)) {
            $this->date = time();
            return true;
        } else {
            return false;
        }
    }
    

    不知道题主是什么困扰,但是你如果是非得不走rules(),可以直接在save()方法指定$runValidationfalse

    RTFM

    http://www.yiiframework.com/doc-2.0/yii-db-baseactiverecord.html#save(...

    회신하다
    0
  • 취소회신하다