2016-04-06 9 views
0

Ich versuche, Daten aus dem Formular mit yii2 Rest API-Controller, Standard Aktion erstellen zu speichern. Neue Zeile wird in DB erstellt, und ID wird zurückgegeben, aber Daten aus dem POST werden nicht gespeichert - nur Nullen erscheinen in der DB, dann überschreibe ich Aktion durch meine eigene, die gleiche Situation. Aber wenn ich direkt in DB speichern, ohne Ruhe-API-Controller, Daten werden erfolgreich gespeichert. Was kann ein Grund für solch seltsames Speichern in DB sein? Vielen Dank! By the way, in Index I post-Daten im Format sehen kann: { "_csrf": "wergferw", "table_name": { "Summe": 25000, "Währung": 1}}Yii2 Rest erstellen - Speichern in DB

Controller ist sehr einfach:

namespace frontend\controllers; 
use yii; 
use yii\rest\ActiveController; 
use yii\web\Response; 


class DemandController extends ActiveController 
{ 
    public $modelClass = 'frontend\models\Demands'; 

    public function behaviors() 
    { 
     $behaviors = parent::behaviors(); 
     $behaviors['contentNegotiator']['formats']['application/json'] 
     = Response::FORMAT_JSON; 

     return $behaviors; 
    } 
} 

ich die Antwort in Ruhe erhalten:

<response><id>37</id></response> 

Modell von gii

namespace frontend\models; 

use Yii; 

class Demands extends \yii\db\ActiveRecord 
{ 

    public static function tableName() 
    { 
     return 'demands'; 
    } 

    public function rules() 
    { 
     return [ 
      [['sum', 'currency'], 'required'], 
     ]; 
    } 

    public function attributeLabels() 
    { 
     return [ 
      'sum' => 'Sum', 
      'currency' => 'Currency', 
     ]; 
    } 
} 
+0

können Sie den Inhalt der Steuerung und Modell posten? Ich vermute, das Problem liegt irgendwo da drin. – spencer4of6

+0

diese Information hinzugefügt – shustr8

+0

Wie laden Sie die Daten in das Modell? –

Antwort

0

Wenn keine der geschrieben dat erzeugt wird a erscheint in der Datenbank, es klingt wie ein Postformat-Problem für mich. Überprüfen Sie, ob Ihre HTTP-Post-Header "Content-Type: application/x-www-form-urlencoded" haben.

+0

Ja, Anwendung/x-www-form-urlencoded, wie kann es geändert werden? Vielleicht sollte ich POST-Daten mit Ajax senden und dort zu Json wechseln? – shustr8

+0

Sie müssen die HTTP-Header über das Tool oder die Sprache steuern können, die Sie zum Senden des Posts verwenden. – karpy47

0

Ich habe auch das Problem so, nachdem Sie diese Zeile zu ändern es für mich gearbeitet hat .. Sie versuchen, die modell-> load() -Methode innerhalb yii/rest/Create

public function run() 
{ 


    $model->load(Yii::$app->getRequest()->getBodyParams(), ''); 
    change this line to 
    $model->load(Yii::$app->getRequest()->getBodyParams()); 


} 

siehe diesen Link zu ändern Weitere Informationen - http://www.yiiframework.com/doc-2.0/yii-base-model.html#load()-detail

Das Modell-> load ($ data, $ formName) - die $ data sollten $ _GET oder $ _POST value von array und $ formName verwenden, um die Daten in das Modell zu laden. Wenn nicht festgelegt, wird formName() verwendet. Also müssen Sie das Modell-> load() in createAction Klasse ändern.

+0

gut .. als Ergebnis schrieb mein Kollege seine eigene create-Methode, out of the Box funktionierte nicht richtig – shustr8

0

Besser haben Sie die activecontroller Standard erstellen Sie dann außer Kraft setzen Aktion versuchen

class CabController extends ActiveController 
    { 
     public $modelClass = 'api\modules\v1\models\Cab'; 

     public function actions(){ 

      $actions = parent::actions(); 
      unset($actions['create']); 
      unset($actions['update']); 
      unset($actions['index']);   
      return $actions; 
     } 

    /* Declare methods supported by APIs */ 
     protected function verbs(){ 
      return [ 
      'create' => ['POST'], 
      'update' => ['PUT', 'PATCH','POST'], 
      'delete' => ['DELETE'], 
      'view' => ['GET'], 
      'index'=>['GET'], 

     ]; 


    } 
    public function actionCreate(){ 

     Yii::$app->response->format = \yii\web\Response::FORMAT_JSON; 
     $model = new Cab; 
     $post_data = Yii::$app->request->post(); 
     $model->load($post_data); 
     $model->save(false);    
     return $model; 
    }  
0

Fügen Sie sicher Spalten in Ihrem Modell

public function rules() 
{ 
    return [ 
     [['sum', 'currency'], 'safe'], 
    ]; 
} 
Verwandte Themen