vitovt
@vitovt

Как разделить модели в Yii2?

Наткнулся на мысль, что при сохранении данных из форм стоит валидировать данные сначала валидирующей моделью, а затем сохранять все через модель, наследуемую от ActiveRecord.

Понимаю логику этого подхода, когда нужно данные добавить в базу. Тогда код достаточно простой

QuestionForm:
namespace backend\models;

use yii\base\Model;

class QuestionForm extends Model {

    public $active;
    public $question;
    public $answer;

    public function rules()
    {
        return[
            ['question','required'],
            ['answer','required'],
            ['active','boolean'],
        ];
    }

    public function create()
    {
        if(!$this->validate()) {
            return null;
        }

        $model = new Question();        
         ......
        return $model->save() ? true : false;
    }
}


В контроллере actionCreate():

public function actionCreate() {

        $model = new QuestionForm();

        if( \Yii::$app->request->isPost) {
            if( $model->load(\Yii::$app->request->post()) && $model->create(  ) ) {
             ...........
            }
        }
        
        return $this->render('create', ['model' => $model]);
    }


Тут все понятно. В view будет форма, с полями, названия которых будут что-то вроде QuestionForm[question] или QuestionForm[active]

Вот теперь самый главный вопрос, как сделать actionUpdate используя валидируюущую модель?

Если так

public function actionUpdate($id) {

         $model = $this->findModel($id);

        if( \Yii::$app->request->isPost) {

            if($model->load( \Yii::$app->request->post()) && $model->save() ) {

                $this->setSuccessAlert();
                $this->redirect(['update', 'id' => $model->id ]);

            }
        }

        return $this->render('update', [
            'model' => $model,
        ]);
    }


То валиадция будет уже в основной модели, которая наследована от ActiveRecord и получается что валидацию нужно дублировать и в Model и здесь.
  • Вопрос задан
  • 276 просмотров
Решения вопроса 1
qonand
@qonand
Software Engineer
Если у Вас есть модель представления с правилами валидации (а Ваша QuestionForm это по сути дела и есть модель представления) и Вы полностью хотите избавиться от валидаций в ActiveRecord тогда Вам в actionUpdate стоит использовать именно ее, а не ActiveRecord. Т.е. загружать данные из поста в QuestionForm, валидировать и уже после этого загонять их в AR и сохранять ...
Например, в самом простом виде это могло бы выглядеть так:
class QuestionForm extends \yii\base\Model {

	public function findModel($id){
		$model = MyActiveRecord::findOne($id)
		return $model;
	}
		
	public function update($id)
	{
		$model = $this->findModel($id);
		if (is_null($model)) {
			return false;
		}
		$model->load($this->attributes, '');
		return $model->save();		
	}
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы