diff --git a/src/Symfony/Component/Form/Extension/Csrf/EventListener/CsrfValidationListener.php b/src/Symfony/Component/Form/Extension/Csrf/EventListener/CsrfValidationListener.php index 345a7ea9a9e28..c011f7ac0e167 100644 --- a/src/Symfony/Component/Form/Extension/Csrf/EventListener/CsrfValidationListener.php +++ b/src/Symfony/Component/Form/Extension/Csrf/EventListener/CsrfValidationListener.php @@ -67,8 +67,10 @@ public function preBind(FormEvent $event) if (!isset($data[$this->fieldName]) || !$this->csrfProvider->isCsrfTokenValid($this->intention, $data[$this->fieldName])) { $form->addError(new FormError('The CSRF token is invalid. Please try to resubmit the form.')); } - - unset($data[$this->fieldName]); + if (is_array($data)) + { + unset($data[$this->fieldName]); + } } $event->setData($data); diff --git a/src/Symfony/Component/Form/Tests/Extension/Csrf/Type/FormTypeCsrfExtensionTest.php b/src/Symfony/Component/Form/Tests/Extension/Csrf/Type/FormTypeCsrfExtensionTest.php index 47dd52927047e..021ca9b32758c 100644 --- a/src/Symfony/Component/Form/Tests/Extension/Csrf/Type/FormTypeCsrfExtensionTest.php +++ b/src/Symfony/Component/Form/Tests/Extension/Csrf/Type/FormTypeCsrfExtensionTest.php @@ -196,6 +196,26 @@ public function testFailIfRootAndCompoundAndTokenMissing() $this->assertFalse($form->isValid()); } + public function testFailIfRootAndCompoundAndBoundDataIsString() + { + $form = $this->factory + ->createBuilder('form', null, array( + 'csrf_field_name' => 'csrf', + 'csrf_provider' => $this->csrfProvider, + 'intention' => '%INTENTION%', + 'compound' => true, + )) + ->add('child', 'text') + ->getForm(); + + $form->bind('malformed request'); + + $this->assertSame(array('child' => null), $form->getData()); + + // Validate accordingly + $this->assertFalse($form->isValid()); + } + public function testDontValidateTokenIfCompoundButNoRoot() { $this->csrfProvider->expects($this->never()) diff --git a/src/Symfony/Component/HttpKernel/EventListener/LocaleListener.php b/src/Symfony/Component/HttpKernel/EventListener/LocaleListener.php index 529314b86d3fa..f3cb804832660 100644 --- a/src/Symfony/Component/HttpKernel/EventListener/LocaleListener.php +++ b/src/Symfony/Component/HttpKernel/EventListener/LocaleListener.php @@ -12,7 +12,9 @@ namespace Symfony\Component\HttpKernel\EventListener; use Symfony\Component\HttpKernel\Event\GetResponseEvent; +use Symfony\Component\HttpKernel\Event\FilterResponseEvent; use Symfony\Component\HttpKernel\KernelEvents; +use Symfony\Component\HttpFoundation\Request; use Symfony\Component\Routing\RequestContextAwareInterface; use Symfony\Component\EventDispatcher\EventSubscriberInterface; @@ -25,6 +27,7 @@ class LocaleListener implements EventSubscriberInterface { private $router; private $defaultLocale; + private $locales = array(); public function __construct($defaultLocale = 'en', RequestContextAwareInterface $router = null) { @@ -32,19 +35,24 @@ public function __construct($defaultLocale = 'en', RequestContextAwareInterface $this->router = $router; } + public function onKernelResponse(FilterResponseEvent $event) + { + array_shift($this->locales); + + // setting back the locale to the previous value + $locale = isset($this->locales[0]) ? $this->locales[0] : $this->defaultLocale; + $request = $event->getRequest(); + $this->setLocale($request, $locale); + } + public function onKernelRequest(GetResponseEvent $event) { $request = $event->getRequest(); $request->setDefaultLocale($this->defaultLocale); + $this->setLocale($request, $request->attributes->get('_locale', $this->defaultLocale)); - if ($locale = $request->attributes->get('_locale')) { - $request->setLocale($locale); - } - - if (null !== $this->router) { - $this->router->getContext()->setParameter('_locale', $request->getLocale()); - } + array_unshift($this->locales, $request->getLocale()); } public static function getSubscribedEvents() @@ -52,6 +60,16 @@ public static function getSubscribedEvents() return array( // must be registered after the Router to have access to the _locale KernelEvents::REQUEST => array(array('onKernelRequest', 16)), + KernelEvents::RESPONSE => 'onKernelResponse', ); } + + private function setLocale(Request $request, $locale) + { + $request->setLocale($locale); + + if (null !== $this->router) { + $this->router->getContext()->setParameter('_locale', $request->getLocale()); + } + } }