Yii2 - прошивка не видна после перенаправления

Флэш-сообщения, кажется, сломаны в случае перенаправления. Я сделал простой тестовый код:

public function actionTest($test = 0) {
    if($test == 0) {
        Yii::$app->getSession()->addFlash('success', 'Follow the white rabbit');
        return Yii::$app->getResponse()->redirect(array('test', 'test' => 1));
    }
    return $this->render('test', []);
}

Вызываю действие без параметра, оно добавляет вспышку и перенаправляет. Когда он рендерит страницу - флэша нет.

Часть просмотра в порядке, потому что, если я установлю вспышку и сделаю рендеринг без перенаправления, он будет отображаться правильно.

Почему?

РЕДАКТИРОВАТЬ: код просмотра макета:

<?php

use frontend\widgets\Alert;

$this->beginPage();
echo $this->render('partials/head');
?>

<body class="no-sidebar">
    <?= $this->beginBody() ?>
    <div id="header">
        <?= $this->render('partials/top') ?>
        <?= $this->render(Yii::$app->user->isGuest ? 'menus/guest' : 'menus/registered') ?>
    </div>
    <!-- Main -->
    <div id="main">
        <?= Alert::widget() ?>
        <?= $content ?>

    </div>

    <?= $this->render('partials/footer') ?>
    <?= $this->endBody() ?>
</body>
</html>

<?php $this->endPage() ?>

person Joe    schedule 02.10.2014    source источник


Ответы (6)


Я получил ту же ошибку, пока не обнаружил, что в моем коде отсутствует return. Итак, с return $this->redirect() работает нормально, а с $this->redirect плохо.

person user5653303    schedule 08.12.2015
comment
Это имеет смысл. Если вы используете перенаправление без возврата, скрипт продолжает работать, он отображает страницу, использует вспышки, а затем перенаправляет. В результате отсутствует вспышка на следующей странице. Так что это нормальное и ожидаемое поведение. - person Mihai P.; 20.04.2016
comment
Чувак, ты спас мой бекон. Я часами возился с этой проблемой, пока не прочитал ваш комментарий. Немедленно исправил. Спасибо! - person Alec Smythe; 09.02.2017

Ваш код выглядит нормально, я не уверен, в чем проблема. Вы можете попробовать использовать

return $this->redirect(['test', 'test' => 1]);

Вместо

return Yii::$app->getResponse()->redirect(array('test', 'test' => 1));

Так выглядит большинство примеров Yii. Но ваш код выглядит нормально после просмотра http://www.yiiframework.com/doc-2.0/yii-web-response.html#redirect()-detail

Вы уверены, что ваш сеанс работает правильно, и вы не уничтожаете его в любой момент?

Это работает для меня:

public function actionChangeDetails()
    {
        $model = Contact::findOne(Yii::$app->user->identity->id);

        if ($model->load(Yii::$app->request->post()) && $model->save()) {
            Yii::$app->session->setFlash('success', 'Form Saved');
            return Yii::$app->getResponse()->redirect(['my-account/change-details']);
        }

        return $this->render('changeDetails', [
            'model' => $model,
        ]);
    }
person Mihai P.    schedule 06.10.2014
comment
Простой $this->redirect будет работать (я тестировал его в новом проекте Yii2), но в моем случае я не могу этого сделать, потому что мне нужно вернуть объект Response. Я спросил на yii2 github, и они не смогли воспроизвести. Возможно, это какая-то проблема сеанса, но пока ее трудно найти. Я точно нигде не уничтожаю сессию. - person Joe; 07.10.2014
comment
Попробуйте с последним Yii, возможно у вас не обновленный. - person Mihai P.; 07.10.2014
comment
Нет, я создал новое приложение с помощью composer. - person Joe; 07.10.2014
comment
$this->redirect на самом деле вызывает Yii::$app->getResponse()->redirect(Url::to($url), $statusCode);, поэтому между двумя функциями нет никакой разницы. Но я могу подтвердить проблему, я сам протестировал ее в своем приложении, и она работает именно так, как вы ее описываете. Можете ли вы дать мне отчет об ошибке, который вы сделали, чтобы я мог снова поднять проблему? - person Mihai P.; 08.10.2014
comment
Я добавил код, как будто он работает для меня в основном ответе. Я проверил это в своем приложении, и оно работает отлично. Я лично обычно не использую return Yii::$app->getResponse()->redirect(['my-account/change-details']);, так как в этом нет смысла. - person Mihai P.; 08.10.2014
comment
Я больше не могу воспроизвести это :( Я попробовал, и сейчас все работает. Через 5 минут после того, как я написал, что все работает нормально, понятия не имею, что изменилось. Можете ли вы попробовать использовать setFlash вместо addFlash, посмотрите, есть ли разница? - person Mihai P.; 09.10.2014
comment
На самом деле я сделал новое тестовое приложение, и оно сработало. В чем была ошибка? Не имею представления. Спасибо за помощь в любом случае. - person Joe; 22.10.2014

Добавьте return в свой redirect

Yii::$app->session->getFlash('key', 'message');

return $this->redirect(['yourAction']);
person leonardo avella    schedule 10.08.2017

У меня есть решение: вы можете добавить строку ниже в файл представления, где должно появиться сообщение:

Затем вы можете добавить строку ниже в файл представления, где должно появиться сообщение.

if(Yii::$app->getResponse()->getStatusCode() != 302) {
   Yii::$app->session->getFlash('error');
}

Или, в качестве альтернативы, вы можете добавить строку ниже в макет содержимого

<?= Alert::widget() ?>
// Before the line
<?= $content ?>
// in app/views/layouts/_content.php 
// Depending on how you arranged your files.
person HeadHunter    schedule 13.06.2016
comment
Добро пожаловать в Stack Overflow! Не могли бы вы объяснить, как ваш ответ решает проблему (ы) из вопроса? Ответы только на код не очень полезны, особенно для других читателей, которые наткнулись на этот пост. Спасибо! - person Cristik; 14.06.2016

На странице просмотра необходимо добавить: 'session->getFlash('success'); ?>', как описано здесь: Yii2 Session, Flash messages, тогда вы увидите свой быстрое сообщение

person Anaxarchos    schedule 14.01.2015

В моем случае флэш-сообщения были недоступны, когда я выполнял перенаправление с метода beforeAction. И использование Yii::$app->end() действительно помогло мне. Вот мой код:

public function beforeAction($action) {
    if ($someVariableIs === false) {
        Yii::$app->session->addFlash("negative", "My flash message");
        Yii::$app->getResponse()->redirect(["/path/to/redirect"]);
        Yii::$app->end();
    }

    // some of your code...

    return true;
}

Надеюсь, это поможет кому-то.

person Akmal    schedule 03.03.2020