我通过以下代码注销用户。这是我在注销按钮后面的视图代码:
<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。
它是什么?
好像你有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请求。
你可以改变视图代码和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',]])
?>
您只能用'logout'=> ['get']替换'logout'=> ['post']。这样你的错误就会得到解决。
这种方式仅适用于Yii Framework版本2。
您还可以使用自定义模板
'items' => [
[
'label' => 'Logout',
'url' => ['/user/security/logout'],
'template' => '<a href="{url}" data-method="post">{label}</a>',
],
]
如果您使用Nav::widget
生成菜单,则注销项应指定linkOptions
:
[
'label' => '<i class="fa fa-sign-out"></i>Logout',
'url' => ['/logout'],
'linkOptions' => ['data-method' => 'post'],
],
下面的工作也假设你可能有额外的类和data-method
属性。
<?=
Html::a(
'Logout (' . Yii::$app->user->identity->username . ')',
['/site/logout'],
['class' => 'ui inverted button', 'data-method' => 'post']
);
?>