From af0a14009fc21d13a8ec81fbaedb466ff9b42be3 Mon Sep 17 00:00:00 2001 From: Drak Date: Sat, 6 Apr 2013 10:34:54 +0100 Subject: [PATCH] [FrameworkBundle] Add configuration to allow control over session start on demand. 1. Gives user control over session start on demand mode. 2. Re-introduce flag to allow session listener to manually start session. --- src/Symfony/Bundle/FrameworkBundle/CHANGELOG.md | 3 +++ .../DependencyInjection/Configuration.php | 5 +++++ .../DependencyInjection/FrameworkExtension.php | 8 ++++++++ .../FrameworkBundle/EventListener/SessionListener.php | 10 ++++++++-- .../Resources/config/schema/symfony-1.0.xsd | 2 ++ .../FrameworkBundle/Resources/config/session.xml | 8 ++++++++ .../Tests/DependencyInjection/Fixtures/php/full.php | 1 + .../Tests/DependencyInjection/Fixtures/xml/full.xml | 2 +- .../Tests/DependencyInjection/Fixtures/yml/full.yml | 1 + .../DependencyInjection/FrameworkExtensionTest.php | 3 +++ 10 files changed, 40 insertions(+), 3 deletions(-) diff --git a/src/Symfony/Bundle/FrameworkBundle/CHANGELOG.md b/src/Symfony/Bundle/FrameworkBundle/CHANGELOG.md index 00d900d1c8..ada613ef9b 100644 --- a/src/Symfony/Bundle/FrameworkBundle/CHANGELOG.md +++ b/src/Symfony/Bundle/FrameworkBundle/CHANGELOG.md @@ -9,6 +9,9 @@ CHANGELOG * added `TimedPhpEngine` * added `--clean` option the the `translation:update` command * added `http_method_override` option + * Reintroduce `auto_start` session config flag which control to `SessionListener` to manually start sessions + during framework request cycle. + * Added session config option `on_demand_mode` to control session start on demand. 2.2.0 ----- diff --git a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Configuration.php b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Configuration.php index 2a376b24cf..b714af0a26 100644 --- a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Configuration.php +++ b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Configuration.php @@ -184,6 +184,11 @@ class Configuration implements ConfigurationInterface ->info('session configuration') ->canBeUnset() ->children() + ->booleanNode('auto_start')->info('Flag for SessionListener to start session') + ->defaultValue(true)->end() + ->scalarNode('on_demand_mode')->info('Start session on demand (on access), 0 - off, 1 - on (strict), 2 - off (lax)') + ->defaultValue(1)->end() + ->scalarNode('mock_name')->defaultValue('MOCKSESSID')->end() ->scalarNode('storage_id')->defaultValue('session.storage.native')->end() ->scalarNode('handler_id')->defaultValue('session.handler.native_file')->end() ->scalarNode('name')->end() diff --git a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php index 72ad0a3cfb..8440c4777f 100644 --- a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php +++ b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php @@ -314,6 +314,14 @@ class FrameworkExtension extends Extension $container->setParameter('session.storage.options', $options); + // this controls the SessionListener to start session + $container->setParameter('session.auto_start', $config['auto_start']); + + // this controls the session start on demand feature + $container->setParameter('session.storage.on_demand_mode', $config['on_demand_mode']); + + $container->setParameter('session.storage.mock_name', $config['mock_name']); + // session handler (the internal callback registered with PHP session management) if (null == $config['handler_id']) { // Set the handler class to be null diff --git a/src/Symfony/Bundle/FrameworkBundle/EventListener/SessionListener.php b/src/Symfony/Bundle/FrameworkBundle/EventListener/SessionListener.php index 7b5ce51db9..0977d8d8dc 100644 --- a/src/Symfony/Bundle/FrameworkBundle/EventListener/SessionListener.php +++ b/src/Symfony/Bundle/FrameworkBundle/EventListener/SessionListener.php @@ -29,10 +29,12 @@ class SessionListener implements EventSubscriberInterface * @var ContainerInterface */ private $container; + private $autoStart; - public function __construct(ContainerInterface $container) + public function __construct(ContainerInterface $container, $autoStart) { $this->container = $container; + $this->autoStart = $autoStart; } public function onKernelRequest(GetResponseEvent $event) @@ -46,7 +48,11 @@ class SessionListener implements EventSubscriberInterface return; } - $request->setSession($this->container->get('session')); + $request->setSession($session = $this->container->get('session')); + + if ($this->autoStart || $request->hasPreviousSession()) { + $session->start(); + } } public static function getSubscribedEvents() diff --git a/src/Symfony/Bundle/FrameworkBundle/Resources/config/schema/symfony-1.0.xsd b/src/Symfony/Bundle/FrameworkBundle/Resources/config/schema/symfony-1.0.xsd index 675a24b2c6..d843151c83 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Resources/config/schema/symfony-1.0.xsd +++ b/src/Symfony/Bundle/FrameworkBundle/Resources/config/schema/symfony-1.0.xsd @@ -77,6 +77,8 @@ + + diff --git a/src/Symfony/Bundle/FrameworkBundle/Resources/config/session.xml b/src/Symfony/Bundle/FrameworkBundle/Resources/config/session.xml index a89cf9a173..aa77a28e5a 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Resources/config/session.xml +++ b/src/Symfony/Bundle/FrameworkBundle/Resources/config/session.xml @@ -8,6 +8,7 @@ Symfony\Component\HttpFoundation\Session\Session Symfony\Component\HttpFoundation\Session\Flash\FlashBag Symfony\Component\HttpFoundation\Session\Attribute\AttributeBag + Symfony\Component\HttpFoundation\Session\Storage\MetadataBag Symfony\Component\HttpFoundation\Session\Storage\NativeSessionStorage Symfony\Component\HttpFoundation\Session\Storage\MockFileSessionStorage Symfony\Component\HttpFoundation\Session\Storage\Handler\NativeFileSessionHandler @@ -24,14 +25,20 @@ %session.storage.options% + + %session.storage.on_demand_mode% +