abler98
@abler98
Software Engineer

Почему ActionFilter не рендерит нужный файл?

Вот создал фильтр, но он не работает, просто выводит главную страницу (/site/index)
class FilterBannedIp extends ActionFilter {
    public function beforeAction($action) {
        $bannedIp = BannedIp::findByIp(Yii::$app->request->getUserIP());

        // die(var_dump(Yii::$app->request->getUserIP()));
        // die($bannedIp->ip);

        if ($bannedIp && $bannedIp->isBanned(Yii::$app->request->getUserIP())) {
            if (Yii::$app->request->isAjax) {
                return 'Error: Ваш IP заблокирован';
            } else {
                return $action->controller->render('/site/banned_ip', [
                    'bannedIp' => $bannedIp,
                ]);
            }
        }

        return parent::beforeAction($action);
    }
}

Условие срабатывает, я проверил, и если указать несуществующий файл в $action->controller->render получаю ошибку, но какой шаблон не укажи, всегда выводит главную страницу.

И как вообще правильно сделать фильтр по IP ко всем контроллерам?
  • Вопрос задан
  • 118 просмотров
Решения вопроса 1
Ozerich
@Ozerich
Freelance Web Developer
Потому что задача фильтра проверить есть ли доступ к действию или нет.

Он может вернуть true или false, рендерить ответ - задача контроллера.

Внутри beforeAction можно вызвать исключение, которое перехватит errorHandler, ну а там в errorHandler->errorAction вы можете зарендерить ошибку
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы