moved ControllerResolver methods to HttpKernel (makes more sense)
This commit is contained in:
parent
c68501cca4
commit
73ab687521
@ -13,9 +13,6 @@ namespace Symfony\Bundle\FrameworkBundle\Controller;
|
||||
|
||||
use Symfony\Component\HttpKernel\Log\LoggerInterface;
|
||||
use Symfony\Component\HttpKernel\Controller\ControllerResolver as BaseControllerResolver;
|
||||
use Symfony\Component\HttpKernel\HttpKernelInterface;
|
||||
use Symfony\Component\HttpFoundation\Request;
|
||||
use Symfony\Component\EventDispatcher\Event;
|
||||
use Symfony\Component\DependencyInjection\ContainerInterface;
|
||||
use Symfony\Bundle\FrameworkBundle\Controller\ControllerNameParser;
|
||||
use Symfony\Component\DependencyInjection\ContainerAwareInterface;
|
||||
@ -29,7 +26,6 @@ class ControllerResolver extends BaseControllerResolver
|
||||
{
|
||||
protected $container;
|
||||
protected $parser;
|
||||
protected $esiSupport;
|
||||
|
||||
/**
|
||||
* Constructor.
|
||||
@ -83,137 +79,4 @@ class ControllerResolver extends BaseControllerResolver
|
||||
|
||||
return array($controller, $method);
|
||||
}
|
||||
|
||||
/**
|
||||
* Forwards the request to another controller.
|
||||
*
|
||||
* @param string $controller The controller name (a string like BlogBundle:Post:index)
|
||||
* @param array $attributes An array of request attributes
|
||||
* @param array $query An array of request query parameters
|
||||
*
|
||||
* @return Response A Response instance
|
||||
*/
|
||||
public function forward($controller, array $attributes = array(), array $query = array())
|
||||
{
|
||||
$attributes['_controller'] = $controller;
|
||||
$subRequest = $this->container->get('request')->duplicate($query, null, $attributes);
|
||||
|
||||
return $this->container->get('kernel')->handle($subRequest, HttpKernelInterface::SUB_REQUEST);
|
||||
}
|
||||
|
||||
/**
|
||||
* Renders a Controller and returns the Response content.
|
||||
*
|
||||
* Note that this method generates an esi:include tag only when both the standalone
|
||||
* option is set to true and the request has ESI capability (@see Symfony\Component\HttpKernel\Cache\ESI).
|
||||
*
|
||||
* Available options:
|
||||
*
|
||||
* * attributes: An array of request attributes (only when the first argument is a controller)
|
||||
* * query: An array of request query parameters (only when the first argument is a controller)
|
||||
* * ignore_errors: true to return an empty string in case of an error
|
||||
* * alt: an alternative controller to execute in case of an error (can be a controller, a URI, or an array with the controller, the attributes, and the query arguments)
|
||||
* * standalone: whether to generate an esi:include tag or not when ESI is supported
|
||||
* * comment: a comment to add when returning an esi:include tag
|
||||
*
|
||||
* @param string $controller A controller name to execute (a string like BlogBundle:Post:index), or a relative URI
|
||||
* @param array $options An array of options
|
||||
*
|
||||
* @return string The Response content
|
||||
*/
|
||||
public function render($controller, array $options = array())
|
||||
{
|
||||
$options = array_merge(array(
|
||||
'attributes' => array(),
|
||||
'query' => array(),
|
||||
'ignore_errors' => !$this->container->getParameter('kernel.debug'),
|
||||
'alt' => array(),
|
||||
'standalone' => false,
|
||||
'comment' => '',
|
||||
), $options);
|
||||
|
||||
if (!is_array($options['alt'])) {
|
||||
$options['alt'] = array($options['alt']);
|
||||
}
|
||||
|
||||
if (null === $this->esiSupport) {
|
||||
$this->esiSupport = $this->container->has('esi') && $this->container->get('esi')->hasSurrogateEsiCapability($this->container->get('request'));
|
||||
}
|
||||
|
||||
if ($this->esiSupport && $options['standalone']) {
|
||||
$uri = $this->generateInternalUri($controller, $options['attributes'], $options['query']);
|
||||
|
||||
$alt = '';
|
||||
if ($options['alt']) {
|
||||
$alt = $this->generateInternalUri($options['alt'][0], isset($options['alt'][1]) ? $options['alt'][1] : array(), isset($options['alt'][2]) ? $options['alt'][2] : array());
|
||||
}
|
||||
|
||||
return $this->container->get('esi')->renderIncludeTag($uri, $alt, $options['ignore_errors'], $options['comment']);
|
||||
}
|
||||
|
||||
$request = $this->container->get('request');
|
||||
|
||||
// controller or URI?
|
||||
if (0 === strpos($controller, '/')) {
|
||||
$subRequest = Request::create($controller, 'get', array(), $request->cookies->all(), array(), $request->server->all());
|
||||
$subRequest->setSession($request->getSession());
|
||||
} else {
|
||||
$options['attributes']['_controller'] = $controller;
|
||||
$options['attributes']['_format'] = $request->getRequestFormat();
|
||||
$subRequest = $request->duplicate($options['query'], null, $options['attributes']);
|
||||
}
|
||||
|
||||
try {
|
||||
$response = $this->container->get('kernel')->handle($subRequest, HttpKernelInterface::SUB_REQUEST, true);
|
||||
|
||||
if (200 != $response->getStatusCode()) {
|
||||
throw new \RuntimeException(sprintf('Error when rendering "%s" (Status code is %s).', $request->getUri(), $response->getStatusCode()));
|
||||
}
|
||||
|
||||
return $response->getContent();
|
||||
} catch (\Exception $e) {
|
||||
if ($options['alt']) {
|
||||
$alt = $options['alt'];
|
||||
unset($options['alt']);
|
||||
$options['attributes'] = isset($alt[1]) ? $alt[1] : array();
|
||||
$options['query'] = isset($alt[2]) ? $alt[2] : array();
|
||||
|
||||
return $this->render($alt[0], $options);
|
||||
}
|
||||
|
||||
if (!$options['ignore_errors']) {
|
||||
throw $e;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Generates an internal URI for a given controller.
|
||||
*
|
||||
* This method uses the "_internal" route, which should be available.
|
||||
*
|
||||
* @param string $controller A controller name to execute (a string like BlogBundle:Post:index), or a relative URI
|
||||
* @param array $attributes An array of request attributes
|
||||
* @param array $query An array of request query parameters
|
||||
*
|
||||
* @return string An internal URI
|
||||
*/
|
||||
public function generateInternalUri($controller, array $attributes = array(), array $query = array())
|
||||
{
|
||||
if (0 === strpos($controller, '/')) {
|
||||
return $controller;
|
||||
}
|
||||
|
||||
$uri = $this->container->get('router')->generate('_internal', array(
|
||||
'controller' => $controller,
|
||||
'path' => $attributes ? http_build_query($attributes) : 'none',
|
||||
'_format' => $this->container->get('request')->getRequestFormat(),
|
||||
), true);
|
||||
|
||||
if ($query) {
|
||||
$uri = $uri.'?'.http_build_query($query);
|
||||
}
|
||||
|
||||
return $uri;
|
||||
}
|
||||
}
|
||||
|
@ -17,12 +17,17 @@ use Symfony\Component\EventDispatcher\EventDispatcher as BaseEventDispatcher;
|
||||
class HttpKernel extends BaseHttpKernel
|
||||
{
|
||||
protected $container;
|
||||
protected $esiSupport;
|
||||
|
||||
public function __construct(ContainerInterface $container, BaseEventDispatcher $eventDispatcher, ControllerResolverInterface $controllerResolver)
|
||||
public function __construct(ContainerInterface $container, ControllerResolverInterface $controllerResolver)
|
||||
{
|
||||
parent::__construct($eventDispatcher, $controllerResolver);
|
||||
|
||||
$this->container = $container;
|
||||
$this->resolver = $controllerResolver;
|
||||
}
|
||||
|
||||
public function setEventDispatcher(BaseEventDispatcher $dispatcher)
|
||||
{
|
||||
$this->dispatcher = $dispatcher;
|
||||
}
|
||||
|
||||
public function handle(Request $request, $type = HttpKernelInterface::MASTER_REQUEST, $catch = true)
|
||||
@ -42,4 +47,137 @@ class HttpKernel extends BaseHttpKernel
|
||||
|
||||
return $response;
|
||||
}
|
||||
|
||||
/**
|
||||
* Forwards the request to another controller.
|
||||
*
|
||||
* @param string $controller The controller name (a string like BlogBundle:Post:index)
|
||||
* @param array $attributes An array of request attributes
|
||||
* @param array $query An array of request query parameters
|
||||
*
|
||||
* @return Response A Response instance
|
||||
*/
|
||||
public function forward($controller, array $attributes = array(), array $query = array())
|
||||
{
|
||||
$attributes['_controller'] = $controller;
|
||||
$subRequest = $this->container->get('request')->duplicate($query, null, $attributes);
|
||||
|
||||
return $this->handle($subRequest, HttpKernelInterface::SUB_REQUEST);
|
||||
}
|
||||
|
||||
/**
|
||||
* Renders a Controller and returns the Response content.
|
||||
*
|
||||
* Note that this method generates an esi:include tag only when both the standalone
|
||||
* option is set to true and the request has ESI capability (@see Symfony\Component\HttpKernel\Cache\ESI).
|
||||
*
|
||||
* Available options:
|
||||
*
|
||||
* * attributes: An array of request attributes (only when the first argument is a controller)
|
||||
* * query: An array of request query parameters (only when the first argument is a controller)
|
||||
* * ignore_errors: true to return an empty string in case of an error
|
||||
* * alt: an alternative controller to execute in case of an error (can be a controller, a URI, or an array with the controller, the attributes, and the query arguments)
|
||||
* * standalone: whether to generate an esi:include tag or not when ESI is supported
|
||||
* * comment: a comment to add when returning an esi:include tag
|
||||
*
|
||||
* @param string $controller A controller name to execute (a string like BlogBundle:Post:index), or a relative URI
|
||||
* @param array $options An array of options
|
||||
*
|
||||
* @return string The Response content
|
||||
*/
|
||||
public function render($controller, array $options = array())
|
||||
{
|
||||
$options = array_merge(array(
|
||||
'attributes' => array(),
|
||||
'query' => array(),
|
||||
'ignore_errors' => !$this->container->getParameter('kernel.debug'),
|
||||
'alt' => array(),
|
||||
'standalone' => false,
|
||||
'comment' => '',
|
||||
), $options);
|
||||
|
||||
if (!is_array($options['alt'])) {
|
||||
$options['alt'] = array($options['alt']);
|
||||
}
|
||||
|
||||
if (null === $this->esiSupport) {
|
||||
$this->esiSupport = $this->container->has('esi') && $this->container->get('esi')->hasSurrogateEsiCapability($this->container->get('request'));
|
||||
}
|
||||
|
||||
if ($this->esiSupport && $options['standalone']) {
|
||||
$uri = $this->generateInternalUri($controller, $options['attributes'], $options['query']);
|
||||
|
||||
$alt = '';
|
||||
if ($options['alt']) {
|
||||
$alt = $this->generateInternalUri($options['alt'][0], isset($options['alt'][1]) ? $options['alt'][1] : array(), isset($options['alt'][2]) ? $options['alt'][2] : array());
|
||||
}
|
||||
|
||||
return $this->container->get('esi')->renderIncludeTag($uri, $alt, $options['ignore_errors'], $options['comment']);
|
||||
}
|
||||
|
||||
$request = $this->container->get('request');
|
||||
|
||||
// controller or URI?
|
||||
if (0 === strpos($controller, '/')) {
|
||||
$subRequest = Request::create($controller, 'get', array(), $request->cookies->all(), array(), $request->server->all());
|
||||
$subRequest->setSession($request->getSession());
|
||||
} else {
|
||||
$options['attributes']['_controller'] = $controller;
|
||||
$options['attributes']['_format'] = $request->getRequestFormat();
|
||||
$subRequest = $request->duplicate($options['query'], null, $options['attributes']);
|
||||
}
|
||||
|
||||
try {
|
||||
$response = $this->handle($subRequest, HttpKernelInterface::SUB_REQUEST, true);
|
||||
|
||||
if (200 != $response->getStatusCode()) {
|
||||
throw new \RuntimeException(sprintf('Error when rendering "%s" (Status code is %s).', $request->getUri(), $response->getStatusCode()));
|
||||
}
|
||||
|
||||
return $response->getContent();
|
||||
} catch (\Exception $e) {
|
||||
if ($options['alt']) {
|
||||
$alt = $options['alt'];
|
||||
unset($options['alt']);
|
||||
$options['attributes'] = isset($alt[1]) ? $alt[1] : array();
|
||||
$options['query'] = isset($alt[2]) ? $alt[2] : array();
|
||||
|
||||
return $this->render($alt[0], $options);
|
||||
}
|
||||
|
||||
if (!$options['ignore_errors']) {
|
||||
throw $e;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Generates an internal URI for a given controller.
|
||||
*
|
||||
* This method uses the "_internal" route, which should be available.
|
||||
*
|
||||
* @param string $controller A controller name to execute (a string like BlogBundle:Post:index), or a relative URI
|
||||
* @param array $attributes An array of request attributes
|
||||
* @param array $query An array of request query parameters
|
||||
*
|
||||
* @return string An internal URI
|
||||
*/
|
||||
public function generateInternalUri($controller, array $attributes = array(), array $query = array())
|
||||
{
|
||||
if (0 === strpos($controller, '/')) {
|
||||
return $controller;
|
||||
}
|
||||
|
||||
$uri = $this->container->get('router')->generate('_internal', array(
|
||||
'controller' => $controller,
|
||||
'path' => $attributes ? http_build_query($attributes) : 'none',
|
||||
'_format' => $this->container->get('request')->getRequestFormat(),
|
||||
), true);
|
||||
|
||||
if ($query) {
|
||||
$uri = $uri.'?'.http_build_query($query);
|
||||
}
|
||||
|
||||
return $uri;
|
||||
}
|
||||
}
|
||||
|
@ -23,8 +23,8 @@
|
||||
|
||||
<service id="http_kernel" class="%http_kernel.class%">
|
||||
<argument type="service" id="service_container" />
|
||||
<argument type="service" id="event_dispatcher" />
|
||||
<argument type="service" id="controller_resolver" />
|
||||
<call method="setEventDispatcher"><argument type="service" id="event_dispatcher" /></call>
|
||||
</service>
|
||||
|
||||
<service id="response" class="%response.class%" scope="prototype">
|
||||
|
@ -92,7 +92,7 @@
|
||||
|
||||
<service id="templating.helper.actions" class="%templating.helper.actions.class%">
|
||||
<tag name="templating.helper" alias="actions" />
|
||||
<argument type="service" id="controller_resolver" />
|
||||
<argument type="service" id="http_kernel" />
|
||||
</service>
|
||||
|
||||
<service id="templating.helper.code" class="%templating.helper.code.class%">
|
||||
|
@ -12,7 +12,7 @@
|
||||
namespace Symfony\Bundle\FrameworkBundle\Templating\Helper;
|
||||
|
||||
use Symfony\Component\Templating\Helper\Helper;
|
||||
use Symfony\Bundle\FrameworkBundle\Controller\ControllerResolver;
|
||||
use Symfony\Bundle\FrameworkBundle\HttpKernel;
|
||||
|
||||
/**
|
||||
* ActionsHelper manages action inclusions.
|
||||
@ -21,16 +21,16 @@ use Symfony\Bundle\FrameworkBundle\Controller\ControllerResolver;
|
||||
*/
|
||||
class ActionsHelper extends Helper
|
||||
{
|
||||
protected $resolver;
|
||||
protected $kernel;
|
||||
|
||||
/**
|
||||
* Constructor.
|
||||
*
|
||||
* @param Constructor $resolver A ControllerResolver instance
|
||||
* @param HttpKernel $kernel A HttpKernel instance
|
||||
*/
|
||||
public function __construct(ControllerResolver $resolver)
|
||||
public function __construct(HttpKernel $kernel)
|
||||
{
|
||||
$this->resolver = $resolver;
|
||||
$this->kernel = $kernel;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -53,7 +53,7 @@ class ActionsHelper extends Helper
|
||||
* @param array $attributes An array of request attributes
|
||||
* @param array $options An array of options
|
||||
*
|
||||
* @see Symfony\Bundle\FrameworkBundle\Controller\ControllerResolver::render()
|
||||
* @see Symfony\Bundle\FrameworkBundle\HttpKernel::render()
|
||||
*/
|
||||
public function render($controller, array $attributes = array(), array $options = array())
|
||||
{
|
||||
@ -64,7 +64,7 @@ class ActionsHelper extends Helper
|
||||
$options['query'] = $options['query'];
|
||||
}
|
||||
|
||||
return $this->resolver->render($controller, $options);
|
||||
return $this->kernel->render($controller, $options);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -38,7 +38,8 @@ class HttpKernelTest extends \PHPUnit_Framework_TestCase
|
||||
|
||||
$dispatcher = new EventDispatcher();
|
||||
$resolver = $this->getMock('Symfony\\Component\\HttpKernel\\Controller\\ControllerResolverInterface');
|
||||
$kernel = new HttpKernel($container, $dispatcher, $resolver);
|
||||
$kernel = new HttpKernel($container, $resolver);
|
||||
$kernel->setEventDispatcher($dispatcher);
|
||||
|
||||
$controller = function() use($expected)
|
||||
{
|
||||
@ -86,7 +87,8 @@ class HttpKernelTest extends \PHPUnit_Framework_TestCase
|
||||
|
||||
$dispatcher = new EventDispatcher();
|
||||
$resolver = $this->getMock('Symfony\\Component\\HttpKernel\\Controller\\ControllerResolverInterface');
|
||||
$kernel = new HttpKernel($container, $dispatcher, $resolver);
|
||||
$kernel = new HttpKernel($container, $resolver);
|
||||
$kernel->setEventDispatcher($dispatcher);
|
||||
|
||||
$controller = function() use ($expected)
|
||||
{
|
||||
|
@ -106,7 +106,7 @@ class TemplatingExtension extends \Twig_Extension
|
||||
$options['query'] = $options['query'];
|
||||
}
|
||||
|
||||
return $this->container->get('controller_resolver')->render($controller, $options);
|
||||
return $this->container->get('http_kernel')->render($controller, $options);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -12,7 +12,7 @@
|
||||
<services>
|
||||
<service id="debug.toolbar" class="%debug.toolbar.class%" public="false">
|
||||
<tag name="kernel.listener" priority="-128" />
|
||||
<argument type="service" id="controller_resolver" />
|
||||
<argument type="service" id="http_kernel" />
|
||||
<argument>%debug.toolbar.intercept_redirects%</argument>
|
||||
</service>
|
||||
</services>
|
||||
|
@ -21,7 +21,7 @@ class WebDebugToolbarListenerTest extends \PHPUnit_Framework_TestCase
|
||||
*/
|
||||
public function testInjectToolbar($content, $expected)
|
||||
{
|
||||
$resolver = $this->getMock('Symfony\Bundle\FrameworkBundle\Controller\ControllerResolver', array(), array(), '', false);
|
||||
$resolver = $this->getMock('Symfony\Bundle\FrameworkBundle\HttpKernel', array(), array(), '', false);
|
||||
$resolver->expects($this->any())
|
||||
->method('render')
|
||||
->will($this->returnValue('WDT'));
|
||||
|
@ -15,8 +15,8 @@ use Symfony\Component\EventDispatcher\EventDispatcher;
|
||||
use Symfony\Component\EventDispatcher\Event;
|
||||
use Symfony\Component\HttpFoundation\Request;
|
||||
use Symfony\Component\HttpFoundation\Response;
|
||||
use Symfony\Bundle\FrameworkBundle\HttpKernel;
|
||||
use Symfony\Component\HttpKernel\HttpKernelInterface;
|
||||
use Symfony\Bundle\FrameworkBundle\Controller\ControllerResolver;
|
||||
|
||||
/**
|
||||
* WebDebugToolbarListener injects the Web Debug Toolbar.
|
||||
@ -25,12 +25,12 @@ use Symfony\Bundle\FrameworkBundle\Controller\ControllerResolver;
|
||||
*/
|
||||
class WebDebugToolbarListener
|
||||
{
|
||||
protected $resolver;
|
||||
protected $kernel;
|
||||
protected $interceptRedirects;
|
||||
|
||||
public function __construct(ControllerResolver $resolver, $interceptRedirects = false)
|
||||
public function __construct(HttpKernel $kernel, $interceptRedirects = false)
|
||||
{
|
||||
$this->resolver = $resolver;
|
||||
$this->kernel = $kernel;
|
||||
$this->interceptRedirects = $interceptRedirects;
|
||||
}
|
||||
|
||||
@ -92,7 +92,7 @@ class WebDebugToolbarListener
|
||||
$substrFunction = 'substr';
|
||||
}
|
||||
|
||||
$toolbar = "\n".str_replace("\n", '', $this->resolver->render('WebProfilerBundle:Profiler:toolbar'))."\n";
|
||||
$toolbar = "\n".str_replace("\n", '', $this->kernel->render('WebProfilerBundle:Profiler:toolbar'))."\n";
|
||||
$content = $response->getContent();
|
||||
|
||||
if (false === $pos = $posrFunction($content, '</body>')) {
|
||||
|
Reference in New Issue
Block a user