Yii2: метод не разрешен (# 405) при выходе из системы
Я выхожу из системы через следующий код. Это мой код просмотра за кнопкой выхода:
<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.
Что это?
Ответы
Ответ 1
Похоже, у вас есть 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.
Ответ 2
u может изменить код представления и эхо вместо
<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',]])
?>
Ответ 3
Вы должны заменить "logout" = > ['post'], с "logout" = > ['get']. Таким образом, ваша ошибка будет решена.
Этот способ работает только с Yii Framework версии 2.
Ответ 4
Вы также можете использовать собственный шаблон
'items' => [
[
'label' => 'Logout',
'url' => ['/user/security/logout'],
'template' => '<a href="{url}" data-method="post">{label}</a>',
],
]
Ответ 5
Если вы используете Nav::widget
для создания меню, то в элементе logout должен быть указан linkOptions
:
[
'label' => '<i class="fa fa-sign-out"></i>Logout',
'url' => ['/logout'],
'linkOptions' => ['data-method' => 'post'],
],
Ответ 6
Следующие работы также предполагают, что вы можете добавить дополнительный атрибут класса и data-method
.
<?=
Html::a(
'Logout (' . Yii::$app->user->identity->username . ')',
['/site/logout'],
['class' => 'ui inverted button', 'data-method' => 'post']
);
?>