web-dev-qa-db-fra.com

Yii2: Méthode non autorisée (# 405) lors de la déconnexion d'un utilisateur

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?

10
user4331629

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.

34
arogachev

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.

1
Евген

Vous pouvez également utiliser un modèle personnalisé 

                     'items' => [
                        [
                            'label' => 'Logout',
                            'url' => ['/user/security/logout'],
                            'template' => '<a href="{url}" data-method="post">{label}</a>',
                        ],
                    ]
1
veyselsahin

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',]])
        ?>
1
Mazafard

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']                
    );
?>  
0
Gajen Sunthara

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'],
],
0
Petr Pánek