From c97d40f837254b45a0bb74df349b2efc15ac797e Mon Sep 17 00:00:00 2001 From: Fabien Potencier Date: Wed, 6 Feb 2013 22:23:26 +0100 Subject: [PATCH 1/2] fixed Request management for FragmentHandler --- .../Extension/HttpKernelExtensionTest.php | 10 +---- .../Resources/config/fragment_renderer.xml | 2 +- .../HttpKernel/Fragment/FragmentHandler.php | 39 ++++--------------- .../Tests/Fragment/FragmentHandlerTest.php | 16 +------- 4 files changed, 11 insertions(+), 56 deletions(-) diff --git a/src/Symfony/Bridge/Twig/Tests/Extension/HttpKernelExtensionTest.php b/src/Symfony/Bridge/Twig/Tests/Extension/HttpKernelExtensionTest.php index c0dc42d2f35f0..8e5e4d1d4756b 100644 --- a/src/Symfony/Bridge/Twig/Tests/Extension/HttpKernelExtensionTest.php +++ b/src/Symfony/Bridge/Twig/Tests/Extension/HttpKernelExtensionTest.php @@ -49,16 +49,8 @@ protected function getFragmentHandler($return) $strategy->expects($this->once())->method('getName')->will($this->returnValue('inline')); $strategy->expects($this->once())->method('render')->will($return); - // simulate a master request - $event = $this->getMockBuilder('Symfony\Component\HttpKernel\Event\GetResponseEvent')->disableOriginalConstructor()->getMock(); - $event - ->expects($this->once()) - ->method('getRequest') - ->will($this->returnValue(Request::create('/'))) - ; - $renderer = new FragmentHandler(array($strategy)); - $renderer->onKernelRequest($event); + $renderer->setRequest(Request::create('/')); return $renderer; } diff --git a/src/Symfony/Bundle/FrameworkBundle/Resources/config/fragment_renderer.xml b/src/Symfony/Bundle/FrameworkBundle/Resources/config/fragment_renderer.xml index cbe3db3257b6e..662f042adeeac 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Resources/config/fragment_renderer.xml +++ b/src/Symfony/Bundle/FrameworkBundle/Resources/config/fragment_renderer.xml @@ -14,9 +14,9 @@ - %kernel.debug% + diff --git a/src/Symfony/Component/HttpKernel/Fragment/FragmentHandler.php b/src/Symfony/Component/HttpKernel/Fragment/FragmentHandler.php index b4f3f9c1eef47..70de8d0e2bdd2 100644 --- a/src/Symfony/Component/HttpKernel/Fragment/FragmentHandler.php +++ b/src/Symfony/Component/HttpKernel/Fragment/FragmentHandler.php @@ -15,10 +15,6 @@ use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpFoundation\StreamedResponse; use Symfony\Component\HttpKernel\Controller\ControllerReference; -use Symfony\Component\HttpKernel\KernelEvents; -use Symfony\Component\HttpKernel\Event\GetResponseEvent; -use Symfony\Component\HttpKernel\Event\FilterResponseEvent; -use Symfony\Component\EventDispatcher\EventSubscriberInterface; /** * Renders a URI that represents a resource fragment. @@ -30,11 +26,11 @@ * * @see FragmentRendererInterface */ -class FragmentHandler implements EventSubscriberInterface +class FragmentHandler { private $debug; private $renderers; - private $requests; + private $request; /** * Constructor. @@ -49,7 +45,6 @@ public function __construct(array $renderers = array(), $debug = false) $this->addRenderer($renderer); } $this->debug = $debug; - $this->requests = array(); } /** @@ -63,23 +58,13 @@ public function addRenderer(FragmentRendererInterface $renderer) } /** - * Stores the Request object. + * Sets the current Request. * - * @param GetResponseEvent $event A GetResponseEvent instance + * @param Request $request The current Request */ - public function onKernelRequest(GetResponseEvent $event) + public function setRequest(Request $request = null) { - array_unshift($this->requests, $event->getRequest()); - } - - /** - * Removes the most recent Request object. - * - * @param FilterResponseEvent $event A FilterResponseEvent instance - */ - public function onKernelResponse(FilterResponseEvent $event) - { - array_shift($this->requests); + $this->request = $request; } /** @@ -108,7 +93,7 @@ public function render($uri, $renderer = 'inline', array $options = array()) throw new \InvalidArgumentException(sprintf('The "%s" renderer does not exist.', $renderer)); } - return $this->deliver($this->renderers[$renderer]->render($uri, $this->requests[0], $options)); + return $this->deliver($this->renderers[$renderer]->render($uri, $this->request, $options)); } /** @@ -126,7 +111,7 @@ public function render($uri, $renderer = 'inline', array $options = array()) protected function deliver(Response $response) { if (!$response->isSuccessful()) { - throw new \RuntimeException(sprintf('Error when rendering "%s" (Status code is %s).', $this->requests[0]->getUri(), $response->getStatusCode())); + throw new \RuntimeException(sprintf('Error when rendering "%s" (Status code is %s).', $this->request->getUri(), $response->getStatusCode())); } if (!$response instanceof StreamedResponse) { @@ -136,14 +121,6 @@ protected function deliver(Response $response) $response->sendContent(); } - public static function getSubscribedEvents() - { - return array( - KernelEvents::REQUEST => 'onKernelRequest', - KernelEvents::RESPONSE => 'onKernelResponse', - ); - } - // to be removed in 2.3 public function fixOptions(array $options) { diff --git a/src/Symfony/Component/HttpKernel/Tests/Fragment/FragmentHandlerTest.php b/src/Symfony/Component/HttpKernel/Tests/Fragment/FragmentHandlerTest.php index e0a5b0ad59342..f2a0838a46424 100644 --- a/src/Symfony/Component/HttpKernel/Tests/Fragment/FragmentHandlerTest.php +++ b/src/Symfony/Component/HttpKernel/Tests/Fragment/FragmentHandlerTest.php @@ -17,13 +17,6 @@ class FragmentHandlerTest extends \PHPUnit_Framework_TestCase { - protected function setUp() - { - if (!class_exists('Symfony\Component\EventDispatcher\EventDispatcher')) { - $this->markTestSkipped('The "EventDispatcher" component is not available'); - } - } - /** * @expectedException \InvalidArgumentException */ @@ -102,14 +95,7 @@ protected function getHandler($returnValue, $arguments = array()) $handler = new FragmentHandler(); $handler->addRenderer($renderer); - - $event = $this->getMockBuilder('Symfony\Component\HttpKernel\Event\GetResponseEvent')->disableOriginalConstructor()->getMock(); - $event - ->expects($this->once()) - ->method('getRequest') - ->will($this->returnValue(Request::create('/'))) - ; - $handler->onKernelRequest($event); + $handler->setRequest(Request::create('/')); return $handler; } From 62e52690e321bb88545f47f8ca1432960835cf5f Mon Sep 17 00:00:00 2001 From: Fabien Potencier Date: Wed, 20 Mar 2013 16:45:42 +0100 Subject: [PATCH 2/2] [HttpKernel] added a safeguard for when a fragment is rendered outside the context of a master request --- src/Symfony/Component/HttpKernel/Fragment/FragmentHandler.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/Symfony/Component/HttpKernel/Fragment/FragmentHandler.php b/src/Symfony/Component/HttpKernel/Fragment/FragmentHandler.php index 70de8d0e2bdd2..54d0a70b7dbec 100644 --- a/src/Symfony/Component/HttpKernel/Fragment/FragmentHandler.php +++ b/src/Symfony/Component/HttpKernel/Fragment/FragmentHandler.php @@ -93,6 +93,10 @@ public function render($uri, $renderer = 'inline', array $options = array()) throw new \InvalidArgumentException(sprintf('The "%s" renderer does not exist.', $renderer)); } + if (null === $this->request) { + throw new \LogicException('Rendering a fragment can only be done when handling a master Request.'); + } + return $this->deliver($this->renderers[$renderer]->render($uri, $this->request, $options)); }