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.
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']);
Si vous essayez de faire une redirection dans beforeAction (), vous devez utiliser la méthode send ()
return $this->redirect('/some/url',302)->send();
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?
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.
voici une autre façon de faire
if(!Yii::$app->request->getIsPost()) {
return Yii::$app->getResponse()->redirect(array('/user/index',302));
}
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;
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
],
],
];
}
essayez par ceci
if(!Yii::$app->request->getIsPost())
{
Yii::$app->response->redirect(array('user/index','id'=>302));
exit(0);
}