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',]])
        ?>

Ответ 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']                
    );
?>