diff --git a/src/Symfony/Component/HttpKernel/Fragment/AbstractSurrogateFragmentRenderer.php b/src/Symfony/Component/HttpKernel/Fragment/AbstractSurrogateFragmentRenderer.php index 1968001a86b98..038e60d056582 100644 --- a/src/Symfony/Component/HttpKernel/Fragment/AbstractSurrogateFragmentRenderer.php +++ b/src/Symfony/Component/HttpKernel/Fragment/AbstractSurrogateFragmentRenderer.php @@ -64,6 +64,8 @@ public function __construct(SurrogateInterface $surrogate = null, FragmentRender public function render($uri, Request $request, array $options = array()) { if (!$this->surrogate || !$this->surrogate->hasSurrogateCapability($request)) { + $options['is_fallback'] = true; + return $this->inlineStrategy->render($uri, $request, $options); } diff --git a/src/Symfony/Component/HttpKernel/Fragment/InlineFragmentRenderer.php b/src/Symfony/Component/HttpKernel/Fragment/InlineFragmentRenderer.php index a6ab82ea28efa..06be8c2a331af 100644 --- a/src/Symfony/Component/HttpKernel/Fragment/InlineFragmentRenderer.php +++ b/src/Symfony/Component/HttpKernel/Fragment/InlineFragmentRenderer.php @@ -59,6 +59,10 @@ public function render($uri, Request $request, array $options = array()) // want that as we want to preserve objects (so we manually set Request attributes // below instead) $attributes = $reference->attributes; + if (isset($options['is_fallback']) && $options['is_fallback']) { + $this->checkNonScalar($attributes); + unset($options['is_fallback']); + } $reference->attributes = array(); // The request format and locale might have been overridden by the user diff --git a/src/Symfony/Component/HttpKernel/Fragment/RoutableFragmentRenderer.php b/src/Symfony/Component/HttpKernel/Fragment/RoutableFragmentRenderer.php index d7eeb89a6befc..5d040efa9abe0 100644 --- a/src/Symfony/Component/HttpKernel/Fragment/RoutableFragmentRenderer.php +++ b/src/Symfony/Component/HttpKernel/Fragment/RoutableFragmentRenderer.php @@ -77,7 +77,7 @@ protected function generateFragmentUri(ControllerReference $reference, Request $ return $request->getBaseUrl().$path; } - private function checkNonScalar($values) + protected function checkNonScalar($values) { foreach ($values as $key => $value) { if (is_array($value)) { diff --git a/src/Symfony/Component/HttpKernel/Tests/DependencyInjection/LazyLoadingFragmentHandlerTest.php b/src/Symfony/Component/HttpKernel/Tests/DependencyInjection/LazyLoadingFragmentHandlerTest.php index 581db45658902..75687b1b3b159 100644 --- a/src/Symfony/Component/HttpKernel/Tests/DependencyInjection/LazyLoadingFragmentHandlerTest.php +++ b/src/Symfony/Component/HttpKernel/Tests/DependencyInjection/LazyLoadingFragmentHandlerTest.php @@ -28,7 +28,6 @@ public function test() $container = $this->getMock('Symfony\Component\DependencyInjection\ContainerInterface'); $container->expects($this->once())->method('get')->will($this->returnValue($renderer)); - $handler = new LazyLoadingFragmentHandler($container, false, $requestStack); $handler->addRendererService('foo', 'foo'); diff --git a/src/Symfony/Component/HttpKernel/Tests/Fragment/EsiFragmentRendererTest.php b/src/Symfony/Component/HttpKernel/Tests/Fragment/EsiFragmentRendererTest.php index 90768f9dac58a..79ef494786f15 100644 --- a/src/Symfony/Component/HttpKernel/Tests/Fragment/EsiFragmentRendererTest.php +++ b/src/Symfony/Component/HttpKernel/Tests/Fragment/EsiFragmentRendererTest.php @@ -21,13 +21,13 @@ class EsiFragmentRendererTest extends \PHPUnit_Framework_TestCase { public function testRenderFallbackToInlineStrategyIfNoRequest() { - $strategy = new EsiFragmentRenderer(new Esi(), $this->getInlineStrategy(true)); + $strategy = new EsiFragmentRenderer(new Esi(), $this->getInlineStrategy(true, array('is_fallback' => true))); $strategy->render('/', Request::create('/')); } public function testRenderFallbackToInlineStrategyIfEsiNotSupported() { - $strategy = new EsiFragmentRenderer(new Esi(), $this->getInlineStrategy(true)); + $strategy = new EsiFragmentRenderer(new Esi(), $this->getInlineStrategy(true, array('is_fallback' => true))); $strategy->render('/', Request::create('/')); } @@ -90,12 +90,17 @@ public function testRenderAltControllerReferenceWithoutSignerThrowsException() $strategy->render('/', $request, array('alt' => new ControllerReference('alt_controller'))); } - private function getInlineStrategy($called = false) + private function getInlineStrategy($called = false, $options = false) { $inline = $this->getMockBuilder('Symfony\Component\HttpKernel\Fragment\InlineFragmentRenderer')->disableOriginalConstructor()->getMock(); if ($called) { - $inline->expects($this->once())->method('render'); + if ($options) { + $inline->expects($this->once())->method('render')->with($this->anything(), $this->anything(), $options); + } + else { + $inline->expects($this->once())->method('render'); + } } return $inline; diff --git a/src/Symfony/Component/HttpKernel/Tests/Fragment/InlineFragmentRendererTest.php b/src/Symfony/Component/HttpKernel/Tests/Fragment/InlineFragmentRendererTest.php index 4e487a478a600..77fe545d9f6bc 100644 --- a/src/Symfony/Component/HttpKernel/Tests/Fragment/InlineFragmentRendererTest.php +++ b/src/Symfony/Component/HttpKernel/Tests/Fragment/InlineFragmentRendererTest.php @@ -67,6 +67,44 @@ public function testRenderWithObjectsAsAttributesPassedAsObjectsInTheController( $this->assertEquals('bar', $response->getContent()); } + /** + * @expectedException \LogicException + */ + public function testRenderWithObjectsAsAttributesWhenIsFallBack() + { + $object = new \stdClass(); + + $subRequest = Request::create('/_fragment?_path=_format%3Dhtml%26_locale%3Den%26_controller%3Dmain_controller'); + $subRequest->attributes->replace(array('object' => $object, '_format' => 'html', '_controller' => 'main_controller', '_locale' => 'en')); + $subRequest->headers->set('x-forwarded-for', array('127.0.0.1')); + $subRequest->server->set('HTTP_X_FORWARDED_FOR', '127.0.0.1'); + + $strategy = new InlineFragmentRenderer($this->getKernelExpectingRequest($subRequest)); + + $strategy->render(new ControllerReference('main_controller', array('object' => $object), array()), Request::create('/'), array('is_fallback' => true)); + } + + /** + * @expectedException \LogicException + */ + public function testRenderWithObjectsAsAttributesPassedAsObjectsInTheControllerWhenIsFallBack() + { + $resolver = $this->getMock('Symfony\\Component\\HttpKernel\\Controller\\ControllerResolver', array('getController')); + $resolver + ->expects($this->never()) + ->method('getController') + ->will($this->returnValue(function (\stdClass $object, Bar $object1) { + return new Response($object1->getBar()); + })) + ; + + $kernel = new HttpKernel(new EventDispatcher(), $resolver); + $renderer = new InlineFragmentRenderer($kernel); + + $response = $renderer->render(new ControllerReference('main_controller', array('object' => new \stdClass(), 'object1' => new Bar()), array()), Request::create('/'), array('is_fallback' => true)); + $this->assertEquals('bar', $response->getContent()); + } + public function testRenderWithTrustedHeaderDisabled() { $trustedHeaderName = Request::getTrustedHeaderName(Request::HEADER_CLIENT_IP);