inject the Request via the action signature, rather than fetching it from the DIC
This commit is contained in:
parent
49062aacac
commit
0c7b65faf6
@ -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();
|
||||||
}
|
}
|
||||||
|
@ -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())
|
||||||
|
Reference in New Issue
Block a user