Ответ 1
В Yii2 нам нужно return()
результат действия. Мне кажется, вам нужно добавить return
перед вашей переадресацией.
return $this->redirect(['user/index']);
Я публикую форму для /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!
Любая помощь была оценена.
В Yii2 нам нужно return()
результат действия. Мне кажется, вам нужно добавить return
перед вашей переадресацией.
return $this->redirect(['user/index']);
Если вы пытаетесь сделать перенаправление в beforeAction(), вам следует использовать метод send()
return $this->redirect('/some/url',302)->send();
Я боролся с перенаправлением, не работая очень долго, ни одно из упомянутых выше не работало для меня, пока я не пробовал это:
Изменить:
return $this->redirect('site/secure');
в
return $this->redirect(['site/secure']);
Другими словами, необходимо заключить его в [] скобки! Я использую PHP 7, возможно, причина?
вот еще один способ сделать это
if(!Yii::$app->request->getIsPost()) {
return Yii::$app->getResponse()->redirect(array('/user/index',302));
}
попробуйте
if(!Yii::$app->request->getIsPost())
{
Yii::$app->response->redirect(array('user/index','id'=>302));
exit(0);
}
Перенаправляет браузер в указанный URL.
Этот метод добавляет заголовок "Местоположение" к текущему ответу. Обратите внимание, что он не отправляет заголовок до вызова send(). В действии контроллера вы можете использовать этот метод следующим образом:
return Yii::$app->getResponse()->redirect($url);
В других местах, если вы хотите немедленно отправить заголовок "Местоположение", вы должны использовать следующий код:
Yii::$app->getResponse()->redirect($url)->send();
return;
Не используйте 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
],
],
];
}
Вы также можете перенаправить этот метод:
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;
.
Для получения дополнительной информации проверьте здесь. Надеюсь, это поможет кому-то.