Yii2:注销用户时不允许的方法(#405)

问题描述 投票:10回答:6

我通过以下代码注销用户。这是我在注销按钮后面的视图代码:

<li>
   <a href="<?= Url::to(['site/logout'])?>">
    <i class="fa fa-sign-out"></i> Log out
   </a>
 </li>

我的控制器代码是:

public function actionLogout()
{
    Yii::$app->user->logout();

    $model = new LoginForm();
    $this->layout = 'index';
    return $this->render('login', ['model' => $model]);
}

在注销中它显示我:

方法不允许。此URL只能处理以下请求方法:POST。

它是什么?

yii2
6个回答
34
投票

好像你有VerbFilter附加到你的logout SiteController行动:

/**
 * @inheritdoc
 */
public function behaviors()
{
    return [            
        'verbs' => [
            'class' => VerbFilter::className(),
            'actions' => [
                'logout' => ['post'],
            ],
        ],
    ];
}

这意味着此操作只能使用POST方法请求,并且您正在请求GET,这就是抛出异常#405的原因。

要么从VerbFilter中删除它,要么使用POST添加data-method属性来请求:

<a href="<?= Url::to(['site/logout'])?>" data-method="post">...</a>

更新:此问题的另一个原因可能是缺少yii\web\YiiAsset的依赖性。确保它包含在AppAsset中:

public $depends = [
    'yii\web\YiiAsset',
    ...
];

YiiAsset提供了data-method属性功能,通过编写更少的代码,可以将行为与行为post联系起来。没有资产,显然链接将充当常规链接,并将发送标准GET请求。


1
投票

你可以改变视图代码和echo而不是

<li>
   <a href="<?= Url::to(['site/logout'])?>">
    <i class="fa fa-sign-out"></i> Log out
   </a>
 </li>

这个:

    <?= 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
投票

您只能用'logout'=> ['get']替换'logout'=> ['post']。这样你的错误就会得到解决。

这种方式仅适用于Yii Framework版本2。


1
投票

您还可以使用自定义模板

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

0
投票

如果您使用Nav::widget生成菜单,则注销项应指定linkOptions

[
  'label' => '<i class="fa fa-sign-out"></i>Logout',
  'url' => ['/logout'],
  'linkOptions' => ['data-method' => 'post'],
],

0
投票

下面的工作也假设你可能有额外的类和data-method属性。

<?= 
    Html::a(
        'Logout (' . Yii::$app->user->identity->username . ')', 
        ['/site/logout'], 
        ['class' => 'ui inverted button', 'data-method' => 'post']                
    );
?>  
© www.soinside.com 2019 - 2024. All rights reserved.