web-dev-qa-db-fra.com

yii2 redirection dans le contrôleur action ne fonctionne pas?

Je poste un formulaire sur/user/save afin de sauvegarder les données de l'utilisateur. Le problème se produit lorsque j'essaie de rediriger l'utilisateur si le $ _SERVER ['REQUEST_METHOD'] n'est PAS 'post'.

Mon code de contrôleur d'utilisateur

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

Il n’ya aucun moyen de faire en sorte que la redirection fonctionne. Bien que !Yii::$app->request->getIsPost() is false l'appel de $this->redirect does nothing!

Toute aide appréciée.

21
Andreas

En Yii2, nous devons return() le résultat de l'action. Je pense que vous devez ajouter un return devant votre redirection.

  return $this->redirect(['user/index']);
50
Dency G B

Si vous essayez de faire une redirection dans beforeAction (), vous devez utiliser la méthode send ()

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

J'ai eu du mal avec la redirection ne fonctionnant pas très longtemps, rien de ce qui est mentionné ci-dessus ne fonctionnait pour moi, jusqu'à ce que j'essaye ceci:

Changement:

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

à:

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

En d'autres termes, il faut le mettre entre [] crochets! J'utilise PHP 7, peut-être la raison?

7
Perry J

Vous pouvez également rediriger par cette méthode:

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

Si vous souhaitez envoyer immédiatement les informations d'en-tête, utilisez-le avec send () . Cette méthode ajoute un emplacement en-tête de la réponse actuelle.

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

Si vous voulez l'URL complète, utilisez comme Url::to(['user/index', 'id' => 302]) avec l'en-tête de use yii\helpers\Url;.

Pour plus d'informations, consultez Here . J'espère que cela aidera quelqu'un.

3
lalithkumar

voici une autre façon de faire

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

Redirige le navigateur vers l'URL spécifiée.

Cette méthode ajoute un en-tête "Location" à la réponse actuelle. Notez qu'il n'envoie pas l'en-tête avant que send () soit appelé. Dans une action du contrôleur, vous pouvez utiliser cette méthode comme suit:

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

Dans d'autres endroits, si vous souhaitez envoyer l'en-tête "Location" immédiatement, vous devez utiliser le code suivant:

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

N'utilisez pas exit(0); C'est une mauvaise pratique dans le meilleur des cas. Utilisez Yii::$app->end();

Donc, votre code ressemblerait à

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

Cela dit, le problème était d’arrêter POST demandes, c’est la mauvaise solution à ce problème (bien que cela fonctionne). Pour arrêter POST demandes dont vous avez besoin utiliser contrôle d'accès .

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
            ],
        ],
    ];
}
1
Coz

essayez par ceci

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