yii2 Отображение параметров POST

У меня есть некоторые JS-скрипт, который отправляет симулированные данные

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

‘shops’ — это массив из ~ 1000 элементов, поэтому я должен отправить его через POST.
У меня есть контроллер yii2 с методом:

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

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

"Missing required parameters: id"

Похоже, что параметры POST не отображаются на параметры метода.
Благодарю.

7

Решение

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

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

Надеюсь это поможет.

6

Другие решения

Итак, нет собственного отображения 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;
}
}

А затем добавьте в маршруты:

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

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

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

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

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

Ну вот.

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

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

Из вашего кода я понял, что вы передаете значения через ajax, используя метод POST, но если вы используете метод действия в вашем контроллере с параметрами, то это означает, что для этого действия требуется метод GET для использования. Так что просто измените ваш метод ajax на

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

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

-2
По вопросам рекламы [email protected]