Yii2 перенаправление в действие контроллера не работает?

Я публикую форму для /user/save для сохранения пользовательских данных. Проблема возникает, когда я пытаюсь перенаправить пользователя, если $_SERVER ['REQUEST_METHOD'] не является 'post'.

Мой код пользовательского контроллера

namespace app\controllers;
use Yii;
use yii\web\Controller;
use app\models\MyUser;

class UserController extends Controller {

public function actionSave() {

    if(!Yii::$app->request->getIsPost()) {
       $this->redirect('/user/index',302);
       exit(0);
   }

   //do something to save user submitted data       
}

}//~CLASS

Невозможно заставить перенаправление работать. Хотя !Yii::$app->request->getIsPost() is false вызов $this->redirect does nothing!

Любая помощь была оценена.

Ответы

Ответ 1

В Yii2 нам нужно return() результат действия. Мне кажется, вам нужно добавить return перед вашей переадресацией.

  return $this->redirect(['user/index']);

Ответ 2

Если вы пытаетесь сделать перенаправление в beforeAction(), вам следует использовать метод send()

 return $this->redirect('/some/url',302)->send();

Ответ 3

Я боролся с перенаправлением, не работая очень долго, ни одно из упомянутых выше не работало для меня, пока я не пробовал это:

Изменить:

return $this->redirect('site/secure');

в

return $this->redirect(['site/secure']);

Другими словами, необходимо заключить его в [] скобки! Я использую PHP 7, возможно, причина?

Ответ 4

вот еще один способ сделать это

if(!Yii::$app->request->getIsPost()) {
    return Yii::$app->getResponse()->redirect(array('/user/index',302));
}

Ответ 5

попробуйте

if(!Yii::$app->request->getIsPost()) 
{
  Yii::$app->response->redirect(array('user/index','id'=>302));
    exit(0);
}

Ответ 6

Перенаправляет браузер в указанный URL.

Этот метод добавляет заголовок "Местоположение" к текущему ответу. Обратите внимание, что он не отправляет заголовок до вызова send(). В действии контроллера вы можете использовать этот метод следующим образом:

return Yii::$app->getResponse()->redirect($url);

В других местах, если вы хотите немедленно отправить заголовок "Местоположение", вы должны использовать следующий код:

Yii::$app->getResponse()->redirect($url)->send();
return;

Ответ 7

Не используйте exit(0);. Эта плохая практика в лучшие времена. Используйте Yii::$app->end();

Итак, ваш код будет выглядеть как

$this->redirect(['index'], 302);
Yii::$app->end();

Тем не менее, хотя фактическая проблема заключалась в прекращении запросов POST, это неправильное решение этой проблемы (хотя оно действительно работает). Чтобы остановить запросы POST, вам необходимо использовать контроль доступа.

public function behaviors()
{
    return [
        'access' => [
            'class' => \yii\filters\AccessControl::className(),
            'only' => ['create', 'update'],
            'rules' => [
                // deny all POST requests
                [
                    'allow' => false,
                    'verbs' => ['POST']
                ],
                // allow authenticated users
                [
                    'allow' => true,
                    'roles' => ['@'],
                ],
                // everything else is denied
            ],
        ],
    ];
}

Ответ 8

Вы также можете перенаправить этот метод:

return Yii::$app->response->redirect(['user/index', 'id' => 10]);

Если вы хотите немедленно отправить информацию заголовка с помощью send(). Этот метод добавляет заголовок Местоположение к текущему ответу.

return Yii::$app->response->redirect(['user/index', 'id' => 10])->send();

Если вам нужен полный URL-адрес, используйте его как Url::to(['user/index', 'id' => 302]) с заголовком use yii\helpers\Url;.

Для получения дополнительной информации проверьте здесь. Надеюсь, это поможет кому-то.