Skip to content

[2.1][HttpFoundation] Multiple session flash messages #3267

Merged
merged 4 commits into from Mar 23, 2012
View
3 CHANGELOG-2.1.md
@@ -304,6 +304,9 @@ To get the diff between two versions, go to https://github.com/symfony/symfony/c
attributes storage behaviour from 2.0.x (default).
* Added `Symfony\Component\HttpFoundation\Attribute\NamespacedAttributeBag` for
namespace session attributes.
+ * Flash API can stores messages in an array so there may be multiple messages
+ per flash type. The old `Session` class API remains without BC break as it
+ will single messages as before.
### HttpKernel
View
21 UPGRADE-2.1.md
@@ -307,30 +307,31 @@ UPGRADE FROM 2.0 to 2.1
Before:
```
- {% if app.session.hasFlash('notice') %}
@fabpot
Symfony member
fabpot added a note Mar 23, 2012

You should keep it like it was as you need to keep how it was done in Symfony 2.0, not before your patch.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
+ {% if app.session.flashbag.has('notice') %}
<div class="flash-notice">
- {{ app.session.flash('notice') }}
+ {{ app.session.flashbag.get('notice') }}
</div>
{% endif %}
```
-
After:
```
- {% if app.session.flashbag.has('notice') %}
+ {% for flashMessage in app.session.flashbag.get('notice') %}
<div class="flash-notice">
- {{ app.session.flashbag.get('notice') }}
+ {{ flashMessage }}
</div>
- {% endif %}
+ {% endfor %}
```
You can process all flash messges in a single loop with:
```
- {% for type, flashMessage in app.session.flashbag.all() %}
- <div class="flash-{{ type }}">
- {{ flashMessage }}
- </div>
+ {% for type, flashMessages in app.session.flashbag.all() %}
+ {% for flashMessage in flashMessages) %}
+ <div class="flash-{{ type }}">
+ {{ flashMessage }}
+ </div>
+ {% endfor %}
{% endfor %}
```
View
4 src/Symfony/Bundle/FrameworkBundle/Templating/Helper/SessionHelper.php
@@ -46,9 +46,9 @@ public function get($name, $default = null)
return $this->session->get($name, $default);
}
- public function getFlash($name, $default = null)
+ public function getFlash($name, array $default = array())
{
- return $this->session->getFlashBag()->get($name);
+ return $this->session->getFlashBag()->get($name, $default);
}
public function getFlashes()
View
2 ...undle/FrameworkBundle/Tests/Functional/Bundle/TestBundle/Controller/SessionController.php
@@ -62,7 +62,7 @@ public function showFlashAction()
$session = $request->getSession();
if ($session->getFlashBag()->has('notice')) {
- $output = $session->getFlashBag()->get('notice');
+ list($output) = $session->getFlashBag()->get('notice');
} else {
$output = 'No flash was set.';
}
View
4 src/Symfony/Bundle/FrameworkBundle/Tests/Templating/Helper/SessionHelperTest.php
@@ -42,13 +42,13 @@ public function testFlash()
$this->assertTrue($helper->hasFlash('notice'));
- $this->assertEquals('bar', $helper->getFlash('notice'));
+ $this->assertEquals(array('bar'), $helper->getFlash('notice'));
}
public function testGetFlashes()
{
$helper = new SessionHelper($this->request);
- $this->assertEquals(array('notice' => 'bar'), $helper->getFlashes());
+ $this->assertEquals(array('notice' => array('bar')), $helper->getFlashes());
}
public function testGet()
View
23 src/Symfony/Component/HttpFoundation/Session/Flash/AutoExpireFlashBag.php
@@ -75,7 +75,15 @@ public function initialize(array &$flashes)
/**
* {@inheritdoc}
*/
- public function peek($type, $default = null)
+ public function add($type, $message)
+ {
+ $this->flashes['new'][$type][] = $message;
@Crell
Crell added a note Feb 19, 2012

Will this generate a notice is flashes['new'][$type] is not yet defined? I seem to recall it doing so for me in the past.

@Seldaek
Symfony member
Seldaek added a note Feb 19, 2012

It doesn't. $foo['bar']['baz'] = true; is valid for example

@Crell
Crell added a note Feb 19, 2012

Ah good. Just checking.

@stof
Symfony member
stof added a note Feb 19, 2012

reading throw a notice. Writing does not

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function peek($type, array $default = array())
{
return $this->has($type) ? $this->flashes['display'][$type] : $default;
}
@@ -91,7 +99,7 @@ public function peekAll()
/**
* {@inheritdoc}
*/
- public function get($type, $default = null)
+ public function get($type, array $default = array())
{
$return = $default;
@@ -129,17 +137,17 @@ public function setAll(array $messages)
/**
* {@inheritdoc}
*/
- public function set($type, $message)
+ public function set($type, $messages)
{
- $this->flashes['new'][$type] = $message;
+ $this->flashes['new'][$type] = (array)$messages;
}
/**
* {@inheritdoc}
*/
public function has($type)
{
- return array_key_exists($type, $this->flashes['display']);
+ return array_key_exists($type, $this->flashes['display']) && $this->flashes['display'][$type];
}
/**
@@ -163,9 +171,6 @@ public function getStorageKey()
*/
public function clear()
{
- $return = $this->all();
- $this->flashes = array('display' => array(), 'new' => array());
-
- return $return;
+ return $this->all();
}
}
View
18 src/Symfony/Component/HttpFoundation/Session/Flash/FlashBag.php
@@ -68,7 +68,15 @@ public function initialize(array &$flashes)
/**
* {@inheritdoc}
*/
- public function peek($type, $default = null)
+ public function add($type, $message)
+ {
+ $this->flashes[$type][] = $message;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function peek($type, array $default =array())
{
return $this->has($type) ? $this->flashes[$type] : $default;
}
@@ -84,7 +92,7 @@ public function peekAll()
/**
* {@inheritdoc}
*/
- public function get($type, $default = null)
+ public function get($type, array $default = array())
{
if (!$this->has($type)) {
return $default;
@@ -111,9 +119,9 @@ public function all()
/**
* {@inheritdoc}
*/
- public function set($type, $message)
+ public function set($type, $messages)
{
- $this->flashes[$type] = $message;
+ $this->flashes[$type] = (array) $messages;
}
/**
@@ -129,7 +137,7 @@ public function setAll(array $messages)
*/
public function has($type)
{
- return array_key_exists($type, $this->flashes);
+ return array_key_exists($type, $this->flashes) && $this->flashes[$type];
}
/**
View
8 src/Symfony/Component/HttpFoundation/Session/Flash/FlashBagInterface.php
@@ -32,11 +32,11 @@ function set($type, $message);
* Gets flash message for a given type.
*
* @param string $type Message category type.
- * @param string $default Default value if $type doee not exist.
+ * @param array $default Default value if $type doee not exist.
*
* @return string
*/
- function peek($type, $default = null);
+ function peek($type, array $default = array());
/**
* Gets all flash messages.
@@ -49,11 +49,11 @@ function peekAll();
* Gets and clears flash from the stack.
*
* @param string $type
- * @param string $default Default value if $type doee not exist.
+ * @param array $default Default value if $type doee not exist.
*
* @return string
*/
- function get($type, $default = null);
+ function get($type, array $default = array());
/**
* Gets and clears flashes from the stack.
View
27 src/Symfony/Component/HttpFoundation/Session/Session.php
@@ -229,7 +229,16 @@ public function getFlashBag()
*/
public function getFlashes()
{
- return $this->getBag('flashes')->all();
+ $all = $this->getBag($this->flashName)->all();
+
+ $return = array();
+ if ($all) {
+ foreach ($all as $name => $array) {
+ $return[$name] = reset($array);
+ }
+ }
+
+ return $return;

Can this be simplified? It's not clear why we have to manually build out the return value.

is_array($all) ? return $all : return array();

@ghost
ghost added a note Feb 29, 2012

No no, this API is designed to replicate the old functionality (no arrays). All this API is already deprecated.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
}
/**
@@ -239,7 +248,9 @@ public function getFlashes()
*/
public function setFlashes($values)
{
- $this->getBag('flashes')->setAll($values);
+ foreach ($values as $name => $value) {
+ $this->getBag($this->flashName)->set($name, $value);
+ }
}
/**
@@ -252,7 +263,9 @@ public function setFlashes($values)
*/
public function getFlash($name, $default = null)
{
- return $this->getBag('flashes')->get($name, $default);
+ $return = $this->getBag($this->flashName)->get($name);
+
+ return empty($return) ? $default : reset($return);
}
/**
@@ -263,7 +276,7 @@ public function getFlash($name, $default = null)
*/
public function setFlash($name, $value)
{
- $this->getBag('flashes')->set($name, $value);
+ $this->getBag($this->flashName)->set($name, $value);
}
/**
@@ -275,7 +288,7 @@ public function setFlash($name, $value)
*/
public function hasFlash($name)
{
- return $this->getBag('flashes')->has($name);
+ return $this->getBag($this->flashName)->has($name);
}
/**
@@ -285,7 +298,7 @@ public function hasFlash($name)
*/
public function removeFlash($name)
{
- $this->getBag('flashes')->get($name);
+ $this->getBag($this->flashName)->get($name);
}
/**
@@ -295,6 +308,6 @@ public function removeFlash($name)
*/
public function clearFlashes()
{
- return $this->getBag('flashes')->clear();
+ return $this->getBag($this->flashName)->clear();
}
}
View
36 tests/Symfony/Tests/Component/HttpFoundation/Session/Flash/AutoExpireFlashBagTest.php
@@ -34,7 +34,7 @@ public function setUp()
{
parent::setUp();
$this->bag = new FlashBag();
- $this->array = array('new' => array('notice' => 'A previous flash message'));
+ $this->array = array('new' => array('notice' => array('A previous flash message')));
$this->bag->initialize($this->array);
}
@@ -47,16 +47,16 @@ public function tearDown()
public function testInitialize()
{
$bag = new FlashBag();
- $array = array('new' => array('notice' => 'A previous flash message'));
+ $array = array('new' => array('notice' => array('A previous flash message')));
$bag->initialize($array);
- $this->assertEquals('A previous flash message', $bag->peek('notice'));
+ $this->assertEquals(array('A previous flash message'), $bag->peek('notice'));
$array = array('new' => array(
- 'notice' => 'Something else',
- 'error' => 'a',
+ 'notice' => array('Something else'),
+ 'error' => array('a'),
));
$bag->initialize($array);
- $this->assertEquals('Something else', $bag->peek('notice'));
- $this->assertEquals('a', $bag->peek('error'));
+ $this->assertEquals(array('Something else'), $bag->peek('notice'));
+ $this->assertEquals(array('a'), $bag->peek('error'));
}
public function testGetStorageKey()
@@ -75,16 +75,16 @@ public function testGetSetName()
public function testPeek()
{
- $this->assertNull($this->bag->peek('non_existing'));
- $this->assertEquals('default', $this->bag->peek('non_existing', 'default'));
- $this->assertEquals('A previous flash message', $this->bag->peek('notice'));
- $this->assertEquals('A previous flash message', $this->bag->peek('notice'));
+ $this->assertEquals(array(), $this->bag->peek('non_existing'));
+ $this->assertEquals(array('default'), $this->bag->peek('non_existing', array('default')));
+ $this->assertEquals(array('A previous flash message'), $this->bag->peek('notice'));
+ $this->assertEquals(array('A previous flash message'), $this->bag->peek('notice'));
}
public function testSet()
{
$this->bag->set('notice', 'Foo');
- $this->assertNotEquals('Foo', $this->bag->peek('notice'));
+ $this->assertEquals(array('A previous flash message'), $this->bag->peek('notice'));
}
public function testHas()
@@ -123,10 +123,10 @@ public function testPeekAll()
public function testGet()
{
- $this->assertNull($this->bag->get('non_existing'));
- $this->assertEquals('default', $this->bag->get('non_existing', 'default'));
- $this->assertEquals('A previous flash message', $this->bag->get('notice'));
- $this->assertNull($this->bag->get('notice'));
+ $this->assertEquals(array(), $this->bag->get('non_existing'));
+ $this->assertEquals(array('default'), $this->bag->get('non_existing', array('default')));
+ $this->assertEquals(array('A previous flash message'), $this->bag->get('notice'));
+ $this->assertEquals(array(), $this->bag->get('notice'));
}
public function testSetAll()
@@ -141,7 +141,7 @@ public function testAll()
$this->bag->set('notice', 'Foo');
$this->bag->set('error', 'Bar');
$this->assertEquals(array(
- 'notice' => 'A previous flash message',
+ 'notice' => array('A previous flash message'),
), $this->bag->all()
);
@@ -150,6 +150,6 @@ public function testAll()
public function testClear()
{
- $this->assertEquals(array('notice' => 'A previous flash message'), $this->bag->clear());
+ $this->assertEquals(array('notice' => array('A previous flash message')), $this->bag->clear());
}
}
View
32 tests/Symfony/Tests/Component/HttpFoundation/Session/Flash/FlashBagTest.php
@@ -35,7 +35,7 @@ public function setUp()
{
parent::setUp();
$this->bag = new FlashBag();
- $this->array = array('notice' => 'A previous flash message');
+ $this->array = array('notice' => array('A previous flash message'));
$this->bag->initialize($this->array);
}
@@ -71,27 +71,27 @@ public function testGetSetName()
public function testPeek()
{
- $this->assertNull($this->bag->peek('non_existing'));
- $this->assertEquals('default', $this->bag->peek('not_existing', 'default'));
- $this->assertEquals('A previous flash message', $this->bag->peek('notice'));
- $this->assertEquals('A previous flash message', $this->bag->peek('notice'));
+ $this->assertEquals(array(), $this->bag->peek('non_existing'));
+ $this->assertEquals(array('default'), $this->bag->peek('not_existing', array('default')));
+ $this->assertEquals(array('A previous flash message'), $this->bag->peek('notice'));
+ $this->assertEquals(array('A previous flash message'), $this->bag->peek('notice'));
}
public function testGet()
{
- $this->assertNull($this->bag->get('non_existing'));
- $this->assertEquals('default', $this->bag->get('not_existing', 'default'));
- $this->assertEquals('A previous flash message', $this->bag->get('notice'));
- $this->assertNull($this->bag->get('notice'));
+ $this->assertEquals(array(), $this->bag->get('non_existing'));
+ $this->assertEquals(array('default'), $this->bag->get('not_existing', array('default')));
+ $this->assertEquals(array('A previous flash message'), $this->bag->get('notice'));
+ $this->assertEquals(array(), $this->bag->get('notice'));
}
public function testAll()
{
$this->bag->set('notice', 'Foo');
$this->bag->set('error', 'Bar');
$this->assertEquals(array(
- 'notice' => 'Foo',
- 'error' => 'Bar'), $this->bag->all()
+ 'notice' => array('Foo'),
+ 'error' => array('Bar')), $this->bag->all()
);
$this->assertEquals(array(), $this->bag->all());
@@ -101,7 +101,7 @@ public function testSet()
{
$this->bag->set('notice', 'Foo');
$this->bag->set('notice', 'Bar');
- $this->assertEquals('Bar', $this->bag->peek('notice'));
+ $this->assertEquals(array('Bar'), $this->bag->peek('notice'));
}
public function testHas()
@@ -120,15 +120,15 @@ public function testPeekAll()
$this->bag->set('notice', 'Foo');
$this->bag->set('error', 'Bar');
$this->assertEquals(array(
- 'notice' => 'Foo',
- 'error' => 'Bar',
+ 'notice' => array('Foo'),
+ 'error' => array('Bar'),
), $this->bag->peekAll()
);
$this->assertTrue($this->bag->has('notice'));
$this->assertTrue($this->bag->has('error'));
$this->assertEquals(array(
- 'notice' => 'Foo',
- 'error' => 'Bar',
+ 'notice' => array('Foo'),
+ 'error' => array('Bar'),
), $this->bag->peekAll()
);
}
View
10 tests/Symfony/Tests/Component/HttpFoundation/Session/SessionTest.php
@@ -175,13 +175,21 @@ public function testGetSetFlashes()
$this->session->setFlashes($array);
$this->assertEquals($array, $this->session->getFlashes());
$this->assertEquals(array(), $this->session->getFlashes());
+ $this->session->getFlashBag()->add('notice', 'foo');
+
+ // test that BC works by only retrieving the first added.
+ $this->session->getFlashBag()->add('notice', 'foo2');
+ $this->assertEquals(array('notice' => 'foo'), $this->session->getFlashes());
}
public function testGetSetFlash()
{
$this->assertNull($this->session->getFlash('notice'));
$this->assertEquals('default', $this->session->getFlash('notice', 'default'));
- $this->session->setFlash('notice', 'foo');
+ $this->session->getFlashBag()->add('notice', 'foo');
+ $this->session->getFlashBag()->add('notice', 'foo2');
+
+ // test that BC works by only retrieving the first added.
$this->assertEquals('foo', $this->session->getFlash('notice'));
$this->assertNull($this->session->getFlash('notice'));
}
View
2 tests/Symfony/Tests/Component/HttpFoundation/Session/Storage/MockFileSessionStorageTest.php
@@ -81,7 +81,7 @@ public function testSave()
$storage->start();
$this->assertEquals('108', $storage->getBag('attributes')->get('new'));
$this->assertTrue($storage->getBag('flashes')->has('newkey'));
- $this->assertEquals('test', $storage->getBag('flashes')->peek('newkey'));
+ $this->assertEquals(array('test'), $storage->getBag('flashes')->peek('newkey'));
}
public function testMultipleInstances()
Something went wrong with that request. Please try again.