webentwicklung-frage-antwort-db.com.de

yii2 POST Parameterzuordnung

ich habe ein js-Skript, das ähnliche Daten sendet:

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

'shops' ist ein Array mit ~ 1000 Elementen, daher sollte ich es per POST senden. Ich habe einen yii2-Controller mit Methode:

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

Routing ist ok, aber ich bekomme diese Fehlermeldung:

"Missing required parameters: id"

Es sieht so aus, als ob POST params Methodenparams nicht zugeordnet werden. Danke.

7
arkhamvm

Daher gibt es kein natives POST-Mapping, aber wir können es wie folgt implementieren:

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;
    }
}

Fügen Sie dann die Routen hinzu:

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

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

Sie können jedoch leicht die magische Bindung ausführen. Sie müssen lediglich die runAction() Ihres Controllers überschreiben. Wenn Sie es nicht für jeden Controller manuell tun möchten, erstellen Sie einfach einen Basiscontroller und erweitern Sie ihn bei Bedarf. Überprüfen Sie das folgende Snippet:

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 wie üblich in Yii1 in Ihrem Controller auf die Aktionen $id und $shops zugreifen.

Hoffe das hilft.

6
smich