сопоставление коде с Yii2 параметров Post

у меня есть сценарий js, который отправляет simular данные:

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

"магазины" - это массив с ~1000 элементами, поэтому я должен отправить его по почте. У меня есть контроллер yii2 с методом:

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

маршрутизация в порядке, но я получаю эту ошибку:

"Missing required parameters: id"

похоже, что параметры POST не сопоставляются с параметрами метода. Спасибо.

5 ответов


вы правы, по какой-то причине 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);
}

тогда вы сможете получить доступ в своем контроллере action $id и $shops обычно, как вы привыкли делать в Yii1.

надеюсь, что это помогает.


итак, нет собственного сопоставления сообщений, но мы можем реализовать его, например:

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

и затем добавьте к маршрутам:

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

когда вы передаете параметры в действие контроллера, эти параметры доступны, только если они находятся в GET url. Если вы отправляете параметры по почте, вам нужно будет получить к ним доступ через метод Yii::$app->request->post.

таким образом, ваша функция выглядит примерно так;

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

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

здесь вы идете.


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

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

что я понимаю из вашего кода, Вы передаете значения через ajax с помощью метода POST, но если вы используете метод действия в своем контроллере с параметрами, то это означает, что это действие должно получить метод для использования. Поэтому просто измените свой метод ajax на

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

и затем проверьте, что он будет работать отлично.