Je me déconnecte utilisateur via le code suivant. Ceci est mon code de vue derrière le bouton de déconnexion:
<li>
<a href="<?= Url::to(['site/logout'])?>">
<i class="fa fa-sign-out"></i> Log out
</a>
</li>
Mon code de contrôleur est:
public function actionLogout()
{
Yii::$app->user->logout();
$model = new LoginForm();
$this->layout = 'index';
return $this->render('login', ['model' => $model]);
}
Dans la déconnexion, il me montre:
Méthode Non Autorisée. Cette URL ne peut gérer que la requête suivante méthodes: POST.
Qu'Est-ce que c'est?
On dirait que vous avez VerbFilter
attaché à logout
action dans votre SiteController
:
/**
* @inheritdoc
*/
public function behaviors()
{
return [
'verbs' => [
'class' => VerbFilter::className(),
'actions' => [
'logout' => ['post'],
],
],
];
}
Cela signifie que cette action ne peut être demandée qu'avec la méthode POST, et que vous demandez avec GET, c'est pourquoi l'exception n ° 405 est levée.
Supprimez ceci de la variable VerbFilter
ou ajoutez l'attribut data-method
à demander avec POST:
<a href="<?= Url::to(['site/logout'])?>" data-method="post">...</a>
Update: Une autre raison de ce problème peut être une dépendance manquante pour yii\web\YiiAsset . Assurez-vous qu'il est inclus dans AppAsset
:
public $depends = [
'yii\web\YiiAsset',
...
];
YiiAsset
fournit l'attribut data-method
qui donne la possibilité de lier agir comme un formulaire avec l'action post
en écrivant moins de code. Sans actif, le lien agira évidemment comme un lien et une demande GET standard sera envoyée.
Vous devez seulement remplacer 'logout' => ['post'], par 'logout' => ['get']. De cette façon, votre erreur sera résolue.
Cette méthode ne fonctionne qu'avec Yii Framework version 2.
Vous pouvez également utiliser un modèle personnalisé
'items' => [
[
'label' => 'Logout',
'url' => ['/user/security/logout'],
'template' => '<a href="{url}" data-method="post">{label}</a>',
],
]
vous pouvez changer le code de vue et écho au lieu de
<li>
<a href="<?= Url::to(['site/logout'])?>">
<i class="fa fa-sign-out"></i> Log out
</a>
</li>
celui-là:
<?= Html::a('<i class="fa fa-sign-out"></i>',
['/site/logout'],
['class'=>'btn btn-default btn-flat']), //optional* -if you need to add style
['data' => ['method' => 'post',]])
?>
Suivre aussi les travaux en supposant que vous pourriez avoir une classe supplémentaire et l'attribut data-method
<?=
Html::a(
'Logout (' . Yii::$app->user->identity->username . ')',
['/site/logout'],
['class' => 'ui inverted button', 'data-method' => 'post']
);
?>
Si vous utilisez Nav::widget
pour générer des menus, vous devez spécifier linkOptions
dans l'élément de déconnexion:
[
'label' => '<i class="fa fa-sign-out"></i>Logout',
'url' => ['/logout'],
'linkOptions' => ['data-method' => 'post'],
],