MVC: Чтение данных из POST внутри модели?

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

Предположим у нас есть POST сабмит большой и сложной формы. Много полей, вложенность, повторяющиеся блоки. И данные из этой формы хочется запихать в модель. Если следовать рекомендациям, то надо в контроллере, поле за полем инициализировать поля и массивы полей модели. Это еще просто решается, если форма плоская.

Но у меня есть желание научить инициализироваться модель по POST запросу самостоятельно. Ведь модель хорошо знает структуру данных, какие нужны поля, где повторяющиеся блоки, вложенность итп. Модель хорошо знает, какие типы данных ей нужны, и может проверять данные на корректность. Т.е. хочется чтобы в контроллере было как то так:
// Контроллер
$model = new MyModel();
if(/* POST запрос */) {
    // Не усложняем длинной инициализацией контроллер. 
    try {
        $model->setDataFromPost(); 
    }
    catch(BadPostDataException $ex) {
       ...
    }
}

setDataFromPost() - Знает какие поля из POST куда надо запихать и как обработать. Знает какие данные принадлежать к повторяющися и циклическим блокам.

Вопрос, насколько такое решение греховно? Почему всегда настойчиво рекомендуется инициализировать данные именно в контроллере, даже если инициализация выльется в сотню строк из рутиных сеттеров?
  • Вопрос задан
  • 2697 просмотров
Пригласить эксперта
Ответы на вопрос 1
trerums
@trerums
Вот так данные присваиваются модели в Yii:
public function actionLogin()
{
    $model=new LoginForm;
    if(isset($_POST['LoginForm']))
    {
        // collects user input data
        $model->attributes=$_POST['LoginForm'];
        // validates user input and redirect to previous page if validated
        if($model->validate())
            $this->redirect(Yii::app()->user->returnUrl);
    }
    // displays the login form
    $this->render('login',array('model'=>$model));
}

Т.е вы предлагаете почти тоже самое. Разве что совсем неверно что у вас модель завязана на источник данных, т.е _POST. Передавайте _POST как параметр. Ну и будьте внимательны при валидации входных данных. И еще - не очень хорошая практика использовать исключение для отлавливания плохих входных данных. Используйте исключения для ИСКЛЮЧИТЕЛЬНЫХ ситуаций. А невалидные данные это штатная ситуация.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы