2015-12-24 5 views
1

В моих контроллеров Gii создает его часто можно увидеть следующее:Тестирование POST в Yii 2.0

if($model->load(Yii::$app->request->post()) && $model->save()){ 
//.....do something such as redirect after save....// 
}else 
{ 
//.....render the form in initial state.....// 
} 

Это работает, чтобы проверить, является ли POST, отправленные с моего вида & & модель, которую я с указанием сохранил опубликованную информацию (как я ее понимаю).

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

Может кто-нибудь объяснить, почему это условие не получится? Я считаю, что проблема связана с «Yii :: $ app-> request-> post()», потому что я удалил кусок «$ model-> save()» для проверки, и он все еще обходит условное выражение.

Пример кода, где он не в моем контроллере:

public function actionFreqopts() 
{ 

    $join = new FreqSubtypeJoin(); 
    $options = new Frequency(); 
    $model = new CreateCrystal(); 
    if ($model->load(Yii::$app->request->post()) && $model->save()) { 

     $model->insertFreqopts(); 
     return $this->redirect(['fieldmap', 'id' => $join->id]); 
    } else { 
     return $this->render('freqopts', ['join' => $join, 'options' => $options]); 
    } 
} 

Моя первая мысль была, что я не указав правильный «$ модели» в том, что я пытаюсь сохранить отправленные данные в FreqSubtypeJoin() в этот случай и $model равен CreateCrystal();, однако, даже если я изменяю модель в этом условном состоянии, она все равно терпит неудачу. Было бы полезно, если бы кто-то мог вкратце объяснить, что метод «загрузка» на самом деле делает в условиях непрофессионала, если это возможно.

ответ

0

load() метод Model класс в основном заполняет модель данными от пользователя, например. a post запрос.

Для этого сначала загружается массив данных в форме, которая соответствует тому, как Yii сохраняет вашу запись. Предполагается, что данные, которые вы пытаетесь загрузить в виде

_POST['Model name']['attribute name']

Это первое, что нужно проверить, и, если ваши данные _POST фактически получает к контроллеру, часто где load() не работает, особенно если вы задали свои собственные имена полей в форме. Поэтому, если вы измените модель, модель не загрузится.

Затем проверьте, какие атрибуты могут быть massively assigned. Это просто означает, что ли атрибуты могут быть назначены ан-масс, как и в $model->load() образом, или были ли они быть установлены один в то время, как в

$model->title = "Some title"; 

Чтобы решить, может ли атрибут быть массивно Yii смотрит на ваш validation rules и ваш scenarios. Он еще не проверяет их, но если в этом сценарии есть правило проверки достоверности, то в этом случае предполагается, что он может быть назначен массово.

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

Следующее, что нужно проверить, - это ваши правила валидации. Yii позволит вам просто назначать атрибуты, имеющие связанные правила.

Эти последние два обычно не приводят к ошибке load(), вы просто получите неполную модель, поэтому, если ваша модель не загружается, я бы предложил посмотреть, как данные передаются из формы, и проверить массив из _POST отправленных данных. Удостоверьтесь, что он имеет форму, указанную выше.

Надеюсь, это поможет!

+0

Это очень полезно! Спасибо за продуманный ответ. Я изменил имена, поэтому я уверен, что это проблема, но я также мог видеть, как правила проверки могут ее отключить слишком, особенно если я использую «модель представления», которая тянет кучу базовых моделей без обработки эти свойства и правила правильно. – Scott

+0

Надеюсь, что это работает @Scott. Когда у вас была возможность проверить его, если бы ответ сработал для вас, было бы полезно, если бы вы могли принять ответ, чтобы другие пользователи могли видеть, что было лучшим ответом. Благодаря! –

 Смежные вопросы

  • Нет связанных вопросов^_^