Symfony2 — как очистить/отредактировать флэш-сообщение

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

if ($request->isMethod('POST')) {
    ...
    ...

    $this->get('session')->getFlashBag()->clear(); // Does not work
    $this->get('session')->getFlashBag()->all();   // Does not work

    $request->getSession()->getFlashBag()->set('user-notice', $flash_message2);

    return $this->redirect($request->headers->get('referer'));
}


$this->get('session')->getFlashBag()->set('user-notice', $flash_message1);

return $this->render(....

Но проблема в том, что отображаемые флэш-сообщения — это $flash_message1, а должно быть $flash_message2.

При попытке использовать add вместо set я вижу их обоих. Я попытался использовать функции Symfony2 clear() и all(): http://api.symfony.com/2.3/Symfony/Component/HttpFoundation/Session/Flash/FlashBagInterface.html, но ничего не изменилось.

Есть идеи? Спасибо !!!


person Milos Cuculovic    schedule 19.11.2013    source источник
comment
не могли бы вы полностью включить соответствующий код метода и, возможно, добавить, как выглядела ваша попытка с clear() и set()?   -  person Nicolai Fröhlich    schedule 19.11.2013
comment
@nifr, Конечно, я отредактировал свой вопрос.   -  person Miloš    schedule 19.11.2013
comment
problem is that the displayed flash messages is the 1st one. ... какое сообщение возвращается, если вы отправляете запрос POST? ... $flash_message или $flash_message 2 ?   -  person Nicolai Fröhlich    schedule 19.11.2013
comment
При использовании поста нужно отображать flashMessage2, но вместо этого отображается flashMessage1.   -  person Miloš    schedule 19.11.2013
comment
хорошо понял - пожалуйста, попробуйте мой ответ.   -  person Nicolai Fröhlich    schedule 19.11.2013


Ответы (3)


Использовать...

$flashBag = $this->get('session')->getFlashBag();
$flashBag->get('user-notice'); // gets message and clears type
$flashBag->set('user-notice', $flash_message2);

... после вашего isPost() состояния.

person Nicolai Fröhlich    schedule 19.11.2013
comment
Аааа, я знаю, в чем проблема. Когда я использую перенаправление, я перенаправляюсь на ту же страницу, поэтому, даже если я устанавливаю flashMessage2, в конце будет установлен flashMessage1, потому что я перенаправляю на ту же страницу. Любая идея о том, как это исправить? - person Miloš; 19.11.2013
comment
Спасибо, но это не решило проблему. $flashBag->has('user-notice') всегда ложно. - person Miloš; 19.11.2013
comment
Вы очистили кеш и кеш браузера? Обновил мой ответ - просто используйте get(), чтобы очистить сообщение. После этого его необходимо отключить ... см. FlashBag Line 97. - person Nicolai Fröhlich; 19.11.2013
comment
Да, оба кеша очищены. Что касается вашего нового ответа, проблема в том, как узнать, нужно ли мне устанавливать 1-е или 2-е сообщение. В обоих случаях я перехожу с перенаправления, а не с поста. Должен ли я использовать простой рендер вместо перенаправления? - person Miloš; 19.11.2013

Чтобы очистить все флэш-сообщения, используйте следующий код:

$this->get('session')->getFlashBag()->clear();
person Chaitenya    schedule 11.11.2014
comment
Почему за это проголосовали? Объяснение помогло бы таким людям, как я, читающим это, понять, что происходит. - person conradkleinespel; 06.11.2015
comment
Проголосовал за, нет абсолютно никаких причин, по которым за это нужно проголосовать. Единственное, что следует отметить, это то, что это очищает ВСЮ флешку, а не конкретную, например «уведомление пользователя». - person Prof; 05.02.2016

Один из простых способов удалить все флеш-сообщения:

// clear all messages from FlashBag
$flashBag = $this->get('session')->getFlashBag();
foreach ($flashBag->keys() as $type) {
    $flashBag->set($type, array());
}

Это отлично работает в Symfony 2.4 и, вероятно, во всех других последних версиях.

person likeitlikeit    schedule 04.04.2014
comment
Это не легко! Самый простой способ: $this->get('session')->getFlashBag()->clear(); - person Pmpr; 17.12.2016
comment
@Trix Раньше была проблема именно с тем, что вы предложили два года назад. Взгляните на вопрос по-другому: Милош спрашивает, что делать, если это не работает. - person likeitlikeit; 21.12.2016