diff --git a/src/Symfony/Component/HttpKernel/Fragment/RoutableFragmentRenderer.php b/src/Symfony/Component/HttpKernel/Fragment/RoutableFragmentRenderer.php index 1137ce59f6..d2300d139b 100644 --- a/src/Symfony/Component/HttpKernel/Fragment/RoutableFragmentRenderer.php +++ b/src/Symfony/Component/HttpKernel/Fragment/RoutableFragmentRenderer.php @@ -64,13 +64,11 @@ abstract class RoutableFragmentRenderer implements FragmentRendererInterface private function checkNonScalar($values) { - foreach ($values as $value) { + foreach ($values as $key => $value) { if (is_array($value)) { $this->checkNonScalar($value); - } - - if (!is_scalar($value)) { - throw new \LogicException('Controller attributes cannot contain non-scalar values.'); + } elseif (!is_scalar($value)) { + throw new \LogicException(sprintf('Controller attributes cannot contain non-scalar values (value for key "%s" is not a scalar).', $key)); } } } diff --git a/src/Symfony/Component/HttpKernel/Tests/Fragment/InlineFragmentRendererTest.php b/src/Symfony/Component/HttpKernel/Tests/Fragment/InlineFragmentRendererTest.php index c7ae7dd9aa..f8d5416a07 100644 --- a/src/Symfony/Component/HttpKernel/Tests/Fragment/InlineFragmentRendererTest.php +++ b/src/Symfony/Component/HttpKernel/Tests/Fragment/InlineFragmentRendererTest.php @@ -71,6 +71,24 @@ class InlineFragmentRendererTest extends \PHPUnit_Framework_TestCase $strategy->render(new ControllerReference('main_controller', array('object' => $object), array()), Request::create('/')); } + public function testRenderWithObjectsAsAttributesPassedAsObjectsInTheController() + { + $resolver = $this->getMock('Symfony\\Component\\HttpKernel\\Controller\\ControllerResolver', array('getController')); + $resolver + ->expects($this->once()) + ->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('/')); + $this->assertEquals('bar', $response->getContent()); + } + /** * @expectedException \RuntimeException */ @@ -168,3 +186,12 @@ class InlineFragmentRendererTest extends \PHPUnit_Framework_TestCase $strategy->render('/', $request); } } + +class Bar { + public $bar = 'bar'; + + public function getBar() + { + return $this->bar; + } +} diff --git a/src/Symfony/Component/HttpKernel/Tests/Fragment/RoutableFragmentRendererTest.php b/src/Symfony/Component/HttpKernel/Tests/Fragment/RoutableFragmentRendererTest.php index b780a162d1..dae52da933 100644 --- a/src/Symfony/Component/HttpKernel/Tests/Fragment/RoutableFragmentRendererTest.php +++ b/src/Symfony/Component/HttpKernel/Tests/Fragment/RoutableFragmentRendererTest.php @@ -47,14 +47,21 @@ class RoutableFragmentRendererTest extends \PHPUnit_Framework_TestCase /** * @expectedException LogicException + * @dataProvider getGenerateFragmentUriDataWithNonScalar */ - public function testGenerateFragmentUriWithObject() + public function testGenerateFragmentUriWithNonScalar($controller) { - $controller = new ControllerReference('controller', array('foo' => new Foo(), 'bar' => 'bar'), array()); - $this->callGenerateFragmentUriMethod($controller, Request::create('/')); } + public function getGenerateFragmentUriDataWithNonScalar() + { + return array( + array(new ControllerReference('controller', array('foo' => new Foo(), 'bar' => 'bar'), array())), + array(new ControllerReference('controller', array('foo' => array('foo' => 'foo'), 'bar' => array('bar' => new Foo())), array())), + ); + } + private function callGenerateFragmentUriMethod(ControllerReference $reference, Request $request) { $renderer = $this->getMockForAbstractClass('Symfony\Component\HttpKernel\Fragment\RoutableFragmentRenderer');