сопоставление коде с 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}
и затем проверьте, что он будет работать отлично.