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

时间:2014-12-11 10:26:08

标签: yii2

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

<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]);
}

在退出时它显示我:

  

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

这是什么?

7 个答案:

答案 0 :(得分:34)

好像您VerbFilter中的logout行动已附加SiteController

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

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

VerbFilter删除此内容或添加data-method属性以通过POST请求

<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 :(得分: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',]])
        ?>

答案 2 :(得分:1)

您只能替换'logout'=&gt; ['post'],'logout'=&gt; ['得到']。这样你的错误就会得到解决。

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

答案 3 :(得分:1)

您还可以使用自定义模板

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

答案 4 :(得分:0)

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

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

答案 5 :(得分:0)

如果您可能需要额外的类和data-method属性,则下面的方法同样适用。

<?= 
    Html::a(
        'Logout (' . Yii::$app->user->identity->username . ')', 
        ['/site/logout'], 
        ['class' => 'ui inverted button', 'data-method' => 'post']                
    );
?>  

答案 6 :(得分:0)

此代码适用于AdminLTE模板。

['label' => 'Sign out (' . Yii::$app->user->identity->username . ')','url' => ['/site/logout'],'template' => '<a href="{url}" data-method="post">{label}</a>',],