yii2 POST参数映射

ark*_*mvm 7 php mapping yii2

我有一些发送simular数据的js脚本:

    $.ajax({
        type: "POST",
        url: '/manage/add-shops/',
        data: {'id':id, 'shops': shops}
Run Code Online (Sandbox Code Playgroud)

'shops'是〜1000个元素的数组,所以我应该通过POST发送它.我有一个yii2控制器方法:

class ManageController extends Controller {
    public function actionAddShops($id, $shops=array()) {
       ....
    }
Run Code Online (Sandbox Code Playgroud)

路由是好的,但我收到此错误:

"Missing required parameters: id"
Run Code Online (Sandbox Code Playgroud)

它看起来像POST params没有映射到方法参数.谢谢.

小智 6

你是对的,出于某种原因,Yii2只会自动绑定GET变量,但不幸的是没有POST.

但是,您可以轻松地进行魔法绑定; 你所要做的就是覆盖runAction()你的控制器.如果您不想手动为每个控制器执行此操作,只需创建一个基本控制器并在需要时从中进行扩展.请查看以下代码段:

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);
}
Run Code Online (Sandbox Code Playgroud)

然后,您将能够访问控制器操作,$id并且$shops通常与Yii1中的操作一样.

希望这可以帮助.


ark*_*mvm 2

因此,没有原生的 POST 映射,但我们可以实现它,如下所示:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,添加到路线:

['pattern'=>'manage/<action:\S+>', 'route'=>'manage/<action>', 'suffix'=>'/', 'class' => 'app\components\OurUrlRule',]
Run Code Online (Sandbox Code Playgroud)