Sfoglia il codice sorgente

[RequestHandler] changed the Request constructor signature to be more explicit

Fabien Potencier 15 anni fa
parent
commit
9606402b6f

+ 33 - 39
src/Symfony/Components/RequestHandler/Request.php

@@ -45,11 +45,14 @@ class Request implements RequestInterface
   /**
    * Constructor.
    *
-   * @param array $parameters An array of parameters (see setParameters())
+   * @param array $query   The GET parameters
+   * @param array $request The POST parameters
+   * @param array $path    The parameters parsed from the PATH_INFO (see Router)
+   * @param array $server  The SERVER parameters
    */
-  public function __construct(array $parameters = array())
+  public function __construct(array $query = null, array $request = null, array $path = null, array $server = null)
   {
-    $this->setParameters($parameters);
+    $this->setParameters($request, $query, $path, $server);
   }
 
   /**
@@ -57,21 +60,17 @@ class Request implements RequestInterface
    *
    * This method also re-initializes all properties.
    *
-   * The parameters can define four elements:
-   *
-   *   * request: The POST parameters
-   *   * query:   The GET parameters
-   *   * path:    The parameters parsed from the PATH_INFO (see Router)
-   *   * server:  The SERVER parameters
-   *
-   * @param array $parameters An array of parameters
+   * @param array $query   The GET parameters
+   * @param array $request The POST parameters
+   * @param array $path    The parameters parsed from the PATH_INFO
+   * @param array $server  The SERVER parameters
    */
-  public function setParameters(array $parameters = array())
+  public function setParameters(array $query = null, array $request = null, array $path = null, array $server = null)
   {
-    $this->requestParameters = isset($parameters['request']) ? $parameters['request'] : $_POST;
-    $this->queryParameters = isset($parameters['query']) ? $parameters['query'] : $_GET;
-    $this->pathParameters = isset($parameters['path']) ? $parameters['path'] : array();
-    $this->serverParameters = isset($parameters['server']) ? $parameters['server'] : $_SERVER;
+    $this->requestParameters = null !== $request ? $request : $_POST;
+    $this->queryParameters = null !== $query ? $query : $_GET;
+    $this->pathParameters = null !== $path ? $path : array();
+    $this->serverParameters = null !== $server ? $server : $_SERVER;
 
     $this->languages = null;
     $this->charsets = null;
@@ -85,30 +84,25 @@ class Request implements RequestInterface
     $this->format = null;
   }
 
-  public function duplicate(array $parameters = array())
-  {
-    $request = clone $this;
-
-    foreach (array('request', 'query', 'path', 'server') as $key)
-    {
-      if (isset($parameters[$key]))
-      {
-        $request->{$key.'Parameters'} = $parameters[$key];
-      }
-    }
-
-    $this->languages = null;
-    $this->charsets = null;
-    $this->acceptableContentTypes = null;
-    $this->scriptName = null;
-    $this->pathInfo = null;
-    $this->requestUri = null;
-    $this->baseUrl = null;
-    $this->basePath = null;
-    $this->method = null;
-    $this->format = null;
+  /**
+   * Clones a request and overrides some of its parameters.
+   *
+   * @param array $query   The GET parameters
+   * @param array $request The POST parameters
+   * @param array $path    The parameters parsed from the PATH_INFO
+   * @param array $server  The SERVER parameters
+   */
+  public function duplicate(array $query = null, array $request = null, array $path = null, array $server = null)
+  {
+    $dup = clone $this;
+    $dup->setParameters(
+      null !== $query ? $query : $this->queryParameters,
+      null !== $request ? $request : $this->requestParameters,
+      null !== $path ? $path : $this->pathParameters,
+      null !== $server ? $server : $this->serverParameters
+    );
 
-    return $request;
+    return $dup;
   }
 
   /**

+ 1 - 1
src/Symfony/Framework/WebBundle/Listener/ControllerLoader.php

@@ -45,7 +45,7 @@ class ControllerLoader
     list($parameters['_bundle'], $parameters['_controller'], $parameters['_action']) = explode(':', $controller);
     $parameters['_format'] = $request->getRequestFormat();
 
-    $request = $request->duplicate(array('path' => $parameters));
+    $request = $request->duplicate(null, null, $parameters);
 
     return $this->container->getRequestHandlerService()->handleRaw($request, false);
   }

+ 1 - 1
src/Symfony/Framework/WebBundle/Listener/ExceptionHandler.php

@@ -67,7 +67,7 @@ class ExceptionHandler
       'logs'            => $this->container->hasService('zend.logger.writer.debug') ? $this->container->getService('zend.logger.writer.debug')->getLogs() : array(),
     );
 
-    $request = $event->getParameter('request')->duplicate(array('path' => $parameters));
+    $request = $event->getParameter('request')->duplicate(null, null, $parameters);
 
     try
     {

+ 68 - 0
tests/Symfony/Tests/Components/RequestHandler/RequestTest.php

@@ -0,0 +1,68 @@
+<?php
+
+/*
+ * This file is part of the symfony package.
+ *
+ * (c) Fabien Potencier <fabien.potencier@symfony-project.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Tests\Components\RequestHandler;
+
+require_once __DIR__.'/../../bootstrap.php';
+
+use Symfony\Components\RequestHandler\Request;
+
+class RequestTest extends \PHPUnit_Framework_TestCase
+{
+  /**
+   * @covers Request::__construct()
+   */
+  public function testConstructor()
+  {
+    $this->testSetParameters();
+  }
+
+  /**
+   * @covers Request::setParameters()
+   */
+  public function testSetParameters()
+  {
+    $request = new Request();
+
+    $request->setParameters(array('foo' => 'bar'));
+    $this->assertEquals('bar', $request->getQueryParameter('foo'), '->setParameter() takes an array of query parameters as its first argument');
+
+    $request->setParameters(null, array('foo' => 'bar'));
+    $this->assertEquals('bar', $request->getRequestParameter('foo'), '->setParameter() takes an array of request parameters as its second argument');
+
+    $request->setParameters(null, null, array('foo' => 'bar'));
+    $this->assertEquals('bar', $request->getPathParameter('foo'), '->setParameter() takes an array of path parameters as its thrid argument');
+
+    $request->setParameters(null, null, null, array('HTTP_FOO' => 'bar'));
+    $this->assertEquals('bar', $request->getHttpHeader('foo'), '->setParameter() takes an array of HTTP headers as its fourth argument');
+  }
+
+  /**
+   * @covers Request::duplicate()
+   */
+  public function testDuplicate()
+  {
+    $request = new Request(array('foo' => 'bar'), array('foo' => 'bar'), array('foo' => 'bar'), array('HTTP_FOO' => 'bar'));
+    $dup = $request->duplicate();
+
+    $this->assertEquals($request->getQueryParameters(), $dup->getQueryParameters(), '->duplicate() duplicates a request an copy the current query parameters');
+    $this->assertEquals($request->getRequestParameters(), $dup->getRequestParameters(), '->duplicate() duplicates a request an copy the current request parameters');
+    $this->assertEquals($request->getPathParameters(), $dup->getPathParameters(), '->duplicate() duplicates a request an copy the current path parameters');
+    $this->assertEquals($request->getHttpHeader('foo'), $dup->getHttpHeader('foo'), '->duplicate() duplicates a request an copy the current HTTP headers');
+
+    $dup = $request->duplicate(array('foo' => 'foobar'), array('foo' => 'foobar'), array('foo' => 'foobar'), array('HTTP_FOO' => 'foobar'));
+
+    $this->assertEquals(array('foo' => 'foobar'), $dup->getQueryParameters(), '->duplicate() overrides the query parameters if provided');
+    $this->assertEquals(array('foo' => 'foobar'), $dup->getRequestParameters(), '->duplicate() overrides the request parameters if provided');
+    $this->assertEquals(array('foo' => 'foobar'), $dup->getPathParameters(), '->duplicate() overrides the path parameters if provided');
+    $this->assertEquals('foobar', $dup->getHttpHeader('foo'), '->duplicate() overrides the HTTP header if provided');
+  }
+}