2014-10-02 1 views
8

В случае перенаправления флеш-сообщения могут быть повреждены. Я сделал простой тестовый код: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', []); 
} 

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

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

Почему?

EDIT: Layout код Вид:

<?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() ?> 

ответ

18

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

+0

Это имеет смысл. Если вы используете перенаправление без возврата, сценарий продолжается, он отображает страницу, он использует вспышки, затем перенаправляет. В результате на следующей странице отсутствует пропущенная вспышка. Так что это нормальное и ожидаемое поведение. –

+0

Человек, которого ты спас мой бекон. Я потратил несколько часов, чтобы справиться с этой проблемой, пока не прочитаю ваш комментарий. Исправлена ​​ошибка. Спасибо! –

+0

приятно, спасибо – kiamoz

4

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

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, 
     ]); 
    } 
+0

Простой '$ this-> redirect' будет работать (я тестировал его в новом проекте Yii2), но я могу» t сделать это в моем случае, потому что я должен вернуть объект Response. Я спросил у yii2 github, и они не могли воспроизвести. Возможно, это какая-то проблема с сеансом, но пока ее трудно найти. Я точно не уничтожаю сессию. – Joe

+0

Попробуйте с последним Yii, возможно, у вас нет обновленного. –

+0

Нет, я создал новое приложение, используя композитор. – Joe

1

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

0

У меня есть решение

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

Добро пожаловать в переполнение стека! Не могли бы вы объяснить, как ваш ответ решает проблему (ы) из вопроса? Кодовые ответы не очень полезны, особенно для будущих читателей, которые наткнулись на этот пост. Благодаря! – Cristik

1

return Добавить в ваш redirect

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

return $this->redirect(['yourAction']); 
Смежные вопросы