Ошибка «Заголовки уже отправлены» в Yii при отображении представления в beforeAction - PullRequest
0 голосов
/ 15 мая 2018

Я читал об обработчиках Yii2 и не понимаю, как правильно их использовать для этого случая.

В основном в моем SiteController у меня есть:

class SiteController extends \app\components\Controller
{
    public function beforeAction($action)
    {
        // Makes some checks and if it's true, will render a file and stop execution of any action
        if (...)
            echo $this->render('standby');
            return false;
        }
        return true;
    }

    // All my other actions here
}

Кажется, это работает хорошо и останавливает выполнение, однако я получаю «Заголовки уже отправлены» для строки render(), как если бы она выполняла перенаправление.

Если я пишу Yii::$app-end() вместо return false, происходит то же самое.

Если я пишу exit(); вместо return false, исключение не отображается, но панель отладки не отображается, поскольку Yii завершается неправильно.

Iпопытался удалить echo $this->render(..), и это привело к пустой странице, без перенаправления, похоже, что Yii жалуется только на то, что я передаю данные из контроллера.

И, конечно, я не могу вернуть результатrender() или верните true, так как он выполнит действие страницы, которое я пытаюсь избежать, и на этом заканчиваю.

Я знаю, возвращая false в beforeAction() триггерах EVENT_BEFORE_ACTION, но я нене вижу, где я должен это использовать. документация по событиям мне не очень помогла.

Так что есть способ отобразить «ждущий» вид, не допуская выполнения других действий и избегая сообщения об ошибке для эха от Controller?

Обратите внимание, что я пытаюсь сделать эту работу без дублирования кода в каждом методе действия, чтобы проверить, был ли результат beforeAction() ложным.

1 Ответ

0 голосов
/ 15 мая 2018

Начиная с Yii 2.0.14, вы не можете отображать эхо в контроллере - ответ должен быть возвращен действием. Если вы хотите сгенерировать ответ в beforeAction(), вам нужно настроить Yii::$app->response компонент вместо отображения содержимого:

public function beforeAction($action) {
    // Makes some checks and if it's true, will render a file and stop execution of any action
    if (...) {
        Yii::$app->response->content = $this->render('standby');
        Yii::$app->response->statusCode = 403; // use real HTTP status code here

        return false;
    }

    return parent::beforeAction($action);
}

Не забудьте позвонить parent::beforeAction($action) - пропуск его приведет к непредсказуемому поведению и затруднит отладку.

...