我通过以下代码注销用户。这是我在注销按钮后面的查看代码:
<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。
这是什么?
答案 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>',],