Browse Source

[HttpFoundation] refactored Session

Fabien Potencier 14 years ago
parent
commit
1467a9bd9d

+ 0 - 2
src/Symfony/Component/Form/Extension/Csrf/CsrfProvider/SessionCsrfProvider.php

@@ -53,8 +53,6 @@ class SessionCsrfProvider extends DefaultCsrfProvider
      */
     protected function getSessionId()
     {
-        $this->session->start();
-
         return $this->session->getId();
     }
 }

+ 47 - 40
src/Symfony/Component/HttpFoundation/Session.php

@@ -21,9 +21,11 @@ use Symfony\Component\HttpFoundation\SessionStorage\SessionStorageInterface;
 class Session implements \Serializable
 {
     protected $storage;
+    protected $started;
     protected $attributes;
+    protected $flashes;
     protected $oldFlashes;
-    protected $started;
+    protected $locale;
     protected $defaultLocale;
 
     /**
@@ -36,8 +38,11 @@ class Session implements \Serializable
     {
         $this->storage = $storage;
         $this->defaultLocale = $defaultLocale;
-        $this->attributes = array('_flash' => array(), '_locale' => $this->defaultLocale);
-        \Locale::setDefault($this->attributes['_locale']);
+        $this->locale = $defaultLocale;
+        $this->flashes = array();
+        $this->oldFlashes = array();
+        $this->attributes = array();
+        $this->setPhpDefaultLocale($this->defaultLocale);
         $this->started = false;
     }
 
@@ -52,21 +57,18 @@ class Session implements \Serializable
 
         $this->storage->start();
 
-        $this->attributes = $this->storage->read('_symfony2');
+        $attributes = $this->storage->read('_symfony2');
 
-        if (!isset($this->attributes['_flash'])) {
-            $this->attributes['_flash'] = array();
-        }
+        if (isset($attributes['attributes'])) {
+            $this->attributes = $attributes['attributes'];
+            $this->flashes = $attributes['flashes'];
+            $this->locale = $attributes['locale'];
+            $this->setPhpDefaultLocale($this->locale);
 
-        if (!isset($this->attributes['_locale'])) {
-            $this->attributes['_locale'] = $this->defaultLocale;
+            // flag current flash messages to be removed at shutdown
+            $this->oldFlashes = array_flip(array_keys($this->flashes));
         }
 
-        \Locale::setDefault($this->attributes['_locale']);
-
-        // flag current flash messages to be removed at shutdown
-        $this->oldFlashes = array_flip(array_keys($this->attributes['_flash']));
-
         $this->started = true;
     }
 
@@ -107,11 +109,7 @@ class Session implements \Serializable
             $this->start();
         }
 
-        if ('_locale' === $name) {
-            $this->setLocale($value);
-        } else {
-            $this->attributes[$name] = $value;
-        }
+        $this->attributes[$name] = $value;
     }
 
     /**
@@ -135,10 +133,6 @@ class Session implements \Serializable
             $this->start();
         }
 
-        if (isset($attributes['_locale'])) {
-            $this->setLocale($attributes['_locale']);
-        }
-
         $this->attributes = $attributes;
     }
 
@@ -168,6 +162,8 @@ class Session implements \Serializable
         }
 
         $this->attributes = array();
+        $this->flashes = array();
+        $this->setPhpDefaultLocale($this->locale = $this->defaultLocale);
     }
 
     /**
@@ -195,6 +191,10 @@ class Session implements \Serializable
      */
     public function getId()
     {
+        if (false === $this->started) {
+            $this->start();
+        }
+
         return $this->storage->getId();
     }
 
@@ -205,11 +205,7 @@ class Session implements \Serializable
      */
     public function getLocale()
     {
-        if (!isset($this->attributes['_locale'])) {
-            $this->attributes['_locale'] = $this->defaultLocale;
-        }
-
-        return $this->attributes['_locale'];
+        return $this->locale;
     }
 
     /**
@@ -223,7 +219,7 @@ class Session implements \Serializable
             $this->start();
         }
 
-        \Locale::setDefault($this->attributes['_locale'] = $locale);
+        $this->setPhpDefaultLocale($this->locale = $locale);
     }
 
     /**
@@ -233,7 +229,7 @@ class Session implements \Serializable
      */
     public function getFlashes()
     {
-        return isset($this->attributes['_flash']) ? $this->attributes['_flash'] : array();
+        return $this->flashes;
     }
 
     /**
@@ -247,7 +243,7 @@ class Session implements \Serializable
             $this->start();
         }
 
-        $this->attributes['_flash'] = $values;
+        $this->flashes = $values;
         $this->oldFlashes = array();
     }
 
@@ -261,7 +257,7 @@ class Session implements \Serializable
      */
     public function getFlash($name, $default = null)
     {
-        return array_key_exists($name, $this->getFlashes()) ? $this->attributes['_flash'][$name] : $default;
+        return array_key_exists($name, $this->flashes) ? $this->flashes[$name] : $default;
     }
 
     /**
@@ -276,7 +272,7 @@ class Session implements \Serializable
             $this->start();
         }
 
-        $this->attributes['_flash'][$name] = $value;
+        $this->flashes[$name] = $value;
         unset($this->oldFlashes[$name]);
     }
 
@@ -293,7 +289,7 @@ class Session implements \Serializable
             $this->start();
         }
 
-        return array_key_exists($name, $this->attributes['_flash']);
+        return array_key_exists($name, $this->flashes);
     }
 
     /**
@@ -307,7 +303,7 @@ class Session implements \Serializable
             $this->start();
         }
 
-        unset($this->attributes['_flash'][$name]);
+        unset($this->flashes[$name]);
     }
 
     /**
@@ -319,7 +315,7 @@ class Session implements \Serializable
             $this->start();
         }
 
-        $this->attributes['_flash'] = array();
+        $this->flashes = array();
         $this->oldFlashes = array();
     }
 
@@ -329,11 +325,13 @@ class Session implements \Serializable
             $this->start();
         }
 
-        if (isset($this->attributes['_flash'])) {
-            $this->attributes['_flash'] = array_diff_key($this->attributes['_flash'], $this->oldFlashes);
-        }
+        $this->flashes = array_diff_key($this->flashes, $this->oldFlashes);
 
-        $this->storage->write('_symfony2', $this->attributes);
+        $this->storage->write('_symfony2', array(
+            'attributes' => $this->attributes,
+            'flashes'    => $this->flashes,
+            'locale'     => $this->locale,
+        ));
     }
 
     public function __destruct()
@@ -354,4 +352,13 @@ class Session implements \Serializable
         $this->attributes = array();
         $this->started = false;
     }
+
+    private function setPhpDefaultLocale($locale)
+    {
+        try {
+            \Locale::setDefault($this->locale);
+        } catch (\Exception $e) {
+            // means that intl is not installed.
+        }
+    }
 }

+ 3 - 11
tests/Symfony/Tests/Component/HttpFoundation/SessionTest.php

@@ -150,7 +150,7 @@ class SessionTest extends \PHPUnit_Framework_TestCase
         $this->session->set('foo', 'bar');
 
         $this->session->save();
-        $compare = array('_symfony2' => array('_flash' => array(), '_locale' => 'fr', 'foo' => 'bar'));
+        $compare = array('_symfony2' => array('attributes' => array('foo' => 'bar'), 'flashes' => array(), 'locale' => 'fr'));
 
         $r = new \ReflectionObject($this->storage);
         $p = $r->getProperty('data');
@@ -164,7 +164,7 @@ class SessionTest extends \PHPUnit_Framework_TestCase
         $this->assertSame('en', $this->session->getLocale(), 'default locale is en');
         $this->assertSame('en', \Locale::getDefault(), '\Locale::getDefault() is en');
 
-        $this->session->set('_locale','de');
+        $this->session->setLocale('de');
         $this->assertSame('de', $this->session->getLocale(), 'locale is de');
         $this->assertSame('de', \Locale::getDefault(), '\Locale::getDefault() is de');
 
@@ -172,10 +172,6 @@ class SessionTest extends \PHPUnit_Framework_TestCase
         $this->session->setLocale('fr');
         $this->assertSame('fr', $this->session->getLocale(), 'locale is fr');
         $this->assertSame('fr', \Locale::getDefault(), '\Locale::getDefault() is fr');
-
-        $this->session->setAttributes(array('_locale' => 'de'));
-        $this->assertSame('de', $this->session->getLocale(), 'locale is de');
-        $this->assertSame('de', \Locale::getDefault(), '\Locale::getDefault() is de');
     }
 
     public function testLocaleAfterClear()
@@ -197,11 +193,7 @@ class SessionTest extends \PHPUnit_Framework_TestCase
         $this->assertSame('en', \Locale::getDefault());
 
         $this->assertSame(array(), $this->session->getFlashes());
-        $this->assertSame(array('_flash' => array(), '_locale' => 'en'), $this->session->getAttributes());
-
-        $this->session->start();
-        $this->assertSame('en', $this->session->getLocale());
-        $this->assertSame('en', \Locale::getDefault());
+        $this->assertSame(array(), $this->session->getAttributes());
     }
 
     protected function getSession()