inject the Request via the action signature, rather than fetching it from the DIC

This commit is contained in:
Lukas Kahwe Smith 2013-04-20 22:34:45 +02:00
parent 49062aacac
commit 0c7b65faf6
2 changed files with 23 additions and 31 deletions

View File

@ -13,6 +13,7 @@ namespace Symfony\Bundle\FrameworkBundle\Controller;
use Symfony\Component\DependencyInjection\ContainerAware; use Symfony\Component\DependencyInjection\ContainerAware;
use Symfony\Component\HttpFoundation\RedirectResponse; use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface; use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
@ -32,13 +33,14 @@ class RedirectController extends ContainerAware
* In case the route name is empty, the status code will be 404 when permanent is false * In case the route name is empty, the status code will be 404 when permanent is false
* and 410 otherwise. * and 410 otherwise.
* *
* @param Request $request The request instance
* @param string $route The route name to redirect to * @param string $route The route name to redirect to
* @param Boolean $permanent Whether the redirection is permanent * @param Boolean $permanent Whether the redirection is permanent
* @param Boolean|array $ignoreAttributes Whether to ignore attributes or an array of attributes to ignore * @param Boolean|array $ignoreAttributes Whether to ignore attributes or an array of attributes to ignore
* *
* @return Response A Response instance * @return Response A Response instance
*/ */
public function redirectAction($route, $permanent = false, $ignoreAttributes = false) public function redirectAction(Request $request, $route, $permanent = false, $ignoreAttributes = false)
{ {
if ('' == $route) { if ('' == $route) {
return new Response(null, $permanent ? 410 : 404); return new Response(null, $permanent ? 410 : 404);
@ -46,7 +48,7 @@ class RedirectController extends ContainerAware
$attributes = array(); $attributes = array();
if (false === $ignoreAttributes || is_array($ignoreAttributes)) { if (false === $ignoreAttributes || is_array($ignoreAttributes)) {
$attributes = $this->container->get('request')->attributes->get('_route_params'); $attributes = $request->attributes->get('_route_params');
unset($attributes['route'], $attributes['permanent']); unset($attributes['route'], $attributes['permanent']);
if ($ignoreAttributes) { if ($ignoreAttributes) {
$attributes = array_diff_key($attributes, array_flip($ignoreAttributes)); $attributes = array_diff_key($attributes, array_flip($ignoreAttributes));
@ -65,6 +67,7 @@ class RedirectController extends ContainerAware
* In case the path is empty, the status code will be 404 when permanent is false * In case the path is empty, the status code will be 404 when permanent is false
* and 410 otherwise. * and 410 otherwise.
* *
* @param Request $request The request instance
* @param string $path The absolute path or URL to redirect to * @param string $path The absolute path or URL to redirect to
* @param Boolean $permanent Whether the redirect is permanent or not * @param Boolean $permanent Whether the redirect is permanent or not
* @param string|null $scheme The URL scheme (null to keep the current one) * @param string|null $scheme The URL scheme (null to keep the current one)
@ -73,7 +76,7 @@ class RedirectController extends ContainerAware
* *
* @return Response A Response instance * @return Response A Response instance
*/ */
public function urlRedirectAction($path, $permanent = false, $scheme = null, $httpPort = null, $httpsPort = null) public function urlRedirectAction(Request $request, $path, $permanent = false, $scheme = null, $httpPort = null, $httpsPort = null)
{ {
if ('' == $path) { if ('' == $path) {
return new Response(null, $permanent ? 410 : 404); return new Response(null, $permanent ? 410 : 404);
@ -86,7 +89,6 @@ class RedirectController extends ContainerAware
return new RedirectResponse($path, $statusCode); return new RedirectResponse($path, $statusCode);
} }
$request = $this->container->get('request');
if (null === $scheme) { if (null === $scheme) {
$scheme = $request->getScheme(); $scheme = $request->getScheme();
} }

View File

@ -24,16 +24,14 @@ class RedirectControllerTest extends TestCase
{ {
public function testEmptyRoute() public function testEmptyRoute()
{ {
$container = $this->getMock('Symfony\Component\DependencyInjection\ContainerInterface'); $request = new Request();
$controller = new RedirectController(); $controller = new RedirectController();
$controller->setContainer($container);
$returnResponse = $controller->redirectAction('', true); $returnResponse = $controller->redirectAction($request, '', true);
$this->assertInstanceOf('\Symfony\Component\HttpFoundation\Response', $returnResponse); $this->assertInstanceOf('\Symfony\Component\HttpFoundation\Response', $returnResponse);
$this->assertEquals(410, $returnResponse->getStatusCode()); $this->assertEquals(410, $returnResponse->getStatusCode());
$returnResponse = $controller->redirectAction('', false); $returnResponse = $controller->redirectAction($request, '', false);
$this->assertInstanceOf('\Symfony\Component\HttpFoundation\Response', $returnResponse); $this->assertInstanceOf('\Symfony\Component\HttpFoundation\Response', $returnResponse);
$this->assertEquals(404, $returnResponse->getStatusCode()); $this->assertEquals(404, $returnResponse->getStatusCode());
} }
@ -71,13 +69,7 @@ class RedirectControllerTest extends TestCase
$container = $this->getMock('Symfony\Component\DependencyInjection\ContainerInterface'); $container = $this->getMock('Symfony\Component\DependencyInjection\ContainerInterface');
$container $container
->expects($this->at(0)) ->expects($this->once())
->method('get')
->with($this->equalTo('request'))
->will($this->returnValue($request));
$container
->expects($this->at(1))
->method('get') ->method('get')
->with($this->equalTo('router')) ->with($this->equalTo('router'))
->will($this->returnValue($router)); ->will($this->returnValue($router));
@ -85,7 +77,7 @@ class RedirectControllerTest extends TestCase
$controller = new RedirectController(); $controller = new RedirectController();
$controller->setContainer($container); $controller->setContainer($container);
$returnResponse = $controller->redirectAction($route, $permanent); $returnResponse = $controller->redirectAction($request, $route, $permanent);
$this->assertRedirectUrl($returnResponse, $url); $this->assertRedirectUrl($returnResponse, $url);
$this->assertEquals($expectedCode, $returnResponse->getStatusCode()); $this->assertEquals($expectedCode, $returnResponse->getStatusCode());
@ -101,21 +93,23 @@ class RedirectControllerTest extends TestCase
public function testEmptyPath() public function testEmptyPath()
{ {
$request = new Request();
$controller = new RedirectController(); $controller = new RedirectController();
$returnResponse = $controller->urlRedirectAction('', true); $returnResponse = $controller->urlRedirectAction($request, '', true);
$this->assertInstanceOf('\Symfony\Component\HttpFoundation\Response', $returnResponse); $this->assertInstanceOf('\Symfony\Component\HttpFoundation\Response', $returnResponse);
$this->assertEquals(410, $returnResponse->getStatusCode()); $this->assertEquals(410, $returnResponse->getStatusCode());
$returnResponse = $controller->urlRedirectAction('', false); $returnResponse = $controller->urlRedirectAction($request, '', false);
$this->assertInstanceOf('\Symfony\Component\HttpFoundation\Response', $returnResponse); $this->assertInstanceOf('\Symfony\Component\HttpFoundation\Response', $returnResponse);
$this->assertEquals(404, $returnResponse->getStatusCode()); $this->assertEquals(404, $returnResponse->getStatusCode());
} }
public function testFullURL() public function testFullURL()
{ {
$request = new Request();
$controller = new RedirectController(); $controller = new RedirectController();
$returnResponse = $controller->urlRedirectAction('http://foo.bar/'); $returnResponse = $controller->urlRedirectAction($request, 'http://foo.bar/');
$this->assertRedirectUrl($returnResponse, 'http://foo.bar/'); $this->assertRedirectUrl($returnResponse, 'http://foo.bar/');
$this->assertEquals(302, $returnResponse->getStatusCode()); $this->assertEquals(302, $returnResponse->getStatusCode());
@ -131,14 +125,14 @@ class RedirectControllerTest extends TestCase
$expectedUrl = "https://$host:$httpsPort$baseUrl$path"; $expectedUrl = "https://$host:$httpsPort$baseUrl$path";
$request = $this->createRequestObject('http', $host, $httpPort, $baseUrl); $request = $this->createRequestObject('http', $host, $httpPort, $baseUrl);
$controller = $this->createRedirectController($request, null, $httpsPort); $controller = $this->createRedirectController(null, $httpsPort);
$returnValue = $controller->urlRedirectAction($path, false, 'https'); $returnValue = $controller->urlRedirectAction($request, $path, false, 'https');
$this->assertRedirectUrl($returnValue, $expectedUrl); $this->assertRedirectUrl($returnValue, $expectedUrl);
$expectedUrl = "http://$host:$httpPort$baseUrl$path"; $expectedUrl = "http://$host:$httpPort$baseUrl$path";
$request = $this->createRequestObject('https', $host, $httpPort, $baseUrl); $request = $this->createRequestObject('https', $host, $httpPort, $baseUrl);
$controller = $this->createRedirectController($request, $httpPort); $controller = $this->createRedirectController($httpPort);
$returnValue = $controller->urlRedirectAction($path, false, 'http'); $returnValue = $controller->urlRedirectAction($request, $path, false, 'http');
$this->assertRedirectUrl($returnValue, $expectedUrl); $this->assertRedirectUrl($returnValue, $expectedUrl);
} }
@ -186,7 +180,7 @@ class RedirectControllerTest extends TestCase
$request = $this->createRequestObject($requestScheme, $host, $requestPort, $baseUrl); $request = $this->createRequestObject($requestScheme, $host, $requestPort, $baseUrl);
$controller = $this->createRedirectController($request); $controller = $this->createRedirectController($request);
$returnValue = $controller->urlRedirectAction($path, false, $scheme, $httpPort, $httpsPort); $returnValue = $controller->urlRedirectAction($request, $path, false, $scheme, $httpPort, $httpsPort);
$this->assertRedirectUrl($returnValue, $expectedUrl); $this->assertRedirectUrl($returnValue, $expectedUrl);
} }
@ -213,14 +207,10 @@ class RedirectControllerTest extends TestCase
return $request; return $request;
} }
private function createRedirectController(Request $request, $httpPort = null, $httpsPort = null) private function createRedirectController($httpPort = null, $httpsPort = null)
{ {
$container = $this->getMock('Symfony\Component\DependencyInjection\ContainerInterface'); $container = $this->getMock('Symfony\Component\DependencyInjection\ContainerInterface');
$container
->expects($this->at(0))
->method('get')
->with($this->equalTo('request'))
->will($this->returnValue($request));
if (null !== $httpPort) { if (null !== $httpPort) {
$container $container
->expects($this->once()) ->expects($this->once())