2015-01-29 12 views
7

Ich habe einige js Skript, das simular Daten senden:yii2 POST-Parameter-Mapping

$.ajax({ 
     type: "POST", 
     url: '/manage/add-shops/', 
     data: {'id':id, 'shops': shops} 

'Geschäfte' ist Array mit ~ 1000 Elemente, also sollte ich es per POST schicken. Ich habe einen yii2-Controller mit Methode:

class ManageController extends Controller { 
    public function actionAddShops($id, $shops=array()) { 
     .... 
    } 

Routing Ok, aber ich bekomme diese Fehlermeldung:

"Missing required parameters: id" 

es so, dass POST params aussehen ist nicht auf Methode params abgebildet. Danke.

Antwort

1

So gibt keine native POST-Mapping ist, aber wir können es umsetzen, wie folgt aus:

class OurUrlRule extends UrlRule implements UrlRuleInterface { 
    public function parseRequest($manager, $request, $add_post = true, $add_files = true) { 
     $result = parent::parseRequest($manager, $request); 
     if($result !== false) { 
      list($route, $params) = $result; 
      if($add_post === true) { 
       $params = array_merge($params,$_POST); 
      } 
      if($add_files === true) { 
       $params = array_merge($params,$_FILES); 
      } 
      return [$route, $params]; 
     } 
     return false; 
    } 
} 

Und dann in den Strecken:

['pattern'=>'manage/<action:\S+>', 'route'=>'manage/<action>', 'suffix'=>'/', 'class' => 'app\components\OurUrlRule',] 
+0

Sorry, aber das ist einfach falsch. Yii hat das Post-Mapping immer implementiert und tut dies auch weiterhin. Siehe hier http://www.yiiframework.com/doc-2.0/yii-web-request.html#post%28%29-detail –

+0

Es tut mir leid, ich habe einen Fehler gemacht, ich meinte POST-Mapping direkt auf aufgerufene Methode . – arkhamvm

+0

Ich sehe was du jetzt meinst. Wie wäre es, eine separate Funktion aufzurufen, wenn die Postdaten als Methodenparameter übergeben wurden? Das könnte erreichen, was du willst. –

-2
class ManageController extends Controller { 
    public function actionAddShops() { 
     var_dump($_POST); 
    } 

Hier gehen Sie.

+0

Gibt es eine automatische POST-Zuordnung? – arkhamvm

+0

Sie können JSON anstelle von POST verwenden. – Vick

+0

Es ist OK für JS-Skript, aber was, wenn es ein Standart POST

ist? – arkhamvm

-1

Wenn Sie Parameter an eine Steuerung übergeben Aktion, diese Parameter sind nur verfügbar, wenn sie im GET einer URL sind. Wenn Sie Parameter per POST senden, müssen Sie über die Yii :: $ app-> request-> post-Methode darauf zugreifen.

so sieht Ihre Funktion am Ende so aus;

enter class ManageController extends Controller { 
public function actionAddShops() { 
    $post = Yii::$app->request->post(); 
    $id = $post['id']; 
    $shops = $post['shops']; 
} 
+1

Genau das wollte ich vermeiden. – arkhamvm

+0

Darf ich fragen, warum Sie dies vermeiden möchten? Es scheint mir der effizienteste Weg, Daten zu Ihrem Controller zu bekommen. –

+0

Weil es einfacher ist, 'function actionAny ($ i, $ j, $ k)' anstelle von 'function actionAny() {$ post = Yii :: $ app-> request-> post(); if (! isset ($ post ['i'] === null) {return false;} else {$ i = $ post ['i'];} 'und so weiter ... – arkhamvm

-2
$.ajax({ 
    type: "POST", 
    url: '/manage/add-shops/', 
    data: {'id':id, 'shops': shops} 

class ManageController extends Controller { 
public function actionAddShops($id, $shops=array()) { 
    .... 
} 

Was ich verstehen, aus dem Code ist, dass Sie Werte durch Ajax POST-Methode sind vorbei, aber wenn Ihr eine Aktion-Methode in Ihrem Controller mit Parametern verwenden, dann bedeutet es, diese Aktion Bedürfnisse Verfahren zur Verwendung GET . Also ändern Sie einfach Ihre Ajax-Methode zu

$.ajax({ 
    type: "GET", 
    url: '/manage/add-shops/', 
    data: {'id':id, 'shops': shops} 

Und dann überprüfen Sie, ob es perfekt funktioniert.

+0

Das Plakat hat das gesagt 'shops' könnte ein Array von ~ 1000 Werten sein, also wäre es nicht angemessen, über GET zu senden. –

+0

Ich kann verstehen, aber nach seinem Controller habe ich den Code geändert. –

4

Sie haben recht, aus irgendeinem Grund bindet Yii2 nur automatisch GET-Variablen, aber leider nicht POST.

Sie können jedoch leicht die magische Bindung machen; Alles, was Sie tun müssen, ist die runAction() Ihres Controllers zu überschreiben. Wenn Sie dies nicht für jeden Controller manuell tun möchten, erstellen Sie einfach einen Basiscontroller und erweitern Sie ihn bei Bedarf. Überprüfen Sie den folgenden Ausschnitt:

public function runAction($id, $params = []) 
{ 
    // Extract the params from the request and bind them to params 
    $params = \yii\helpers\BaseArrayHelper::merge(Yii::$app->getRequest()->getBodyParams(), $params); 
    return parent::runAction($id, $params); 
} 

Dann können Sie in Ihrem Controller-Aktion für den Zugriff auf $id und $shops normalerweise, wie Sie in Yii1 tun verwendet.

Hoffe, das hilft.