Browse Source

Merge pull request #11490 from cakephp/request-addparams

3.next - Deprecate Request::addParams()
Mark Story 8 years ago
parent
commit
4d0f36696c

+ 8 - 6
src/Controller/Component/AuthComponent.php

@@ -383,7 +383,7 @@ class AuthComponent extends Component
         if ($auth === false) {
             throw new Exception('At least one authenticate object must be available.');
         }
-        $result = $auth->unauthenticated($this->request, $response);
+        $result = $auth->unauthenticated($controller->request, $response);
         if ($result !== null) {
             return $result;
         }
@@ -535,7 +535,7 @@ class AuthComponent extends Component
             $user = $this->user();
         }
         if (empty($request)) {
-            $request = $this->request;
+            $request = $this->getController()->getRequest();
         }
         if (empty($this->_authorizeObjects)) {
             $this->constructAuthorize();
@@ -749,7 +749,7 @@ class AuthComponent extends Component
             $this->constructAuthenticate();
         }
         foreach ($this->_authenticateObjects as $auth) {
-            $result = $auth->getUser($this->request);
+            $result = $auth->getUser($this->getController()->getRequest());
             if (!empty($result) && is_array($result)) {
                 $this->_authenticationProvider = $auth;
                 $event = $this->dispatchEvent('Auth.afterIdentify', [$result, $auth]);
@@ -785,7 +785,7 @@ class AuthComponent extends Component
      */
     public function redirectUrl($url = null)
     {
-        $redirectUrl = $this->request->getQuery(static::QUERY_STRING_REDIRECT);
+        $redirectUrl = $this->getController()->getRequest()->getQuery(static::QUERY_STRING_REDIRECT);
         if ($redirectUrl && (substr($redirectUrl, 0, 1) !== '/' || substr($redirectUrl, 0, 2) === '//')) {
             $redirectUrl = null;
         }
@@ -825,7 +825,7 @@ class AuthComponent extends Component
             $this->constructAuthenticate();
         }
         foreach ($this->_authenticateObjects as $auth) {
-            $result = $auth->authenticate($this->request, $this->response);
+            $result = $auth->authenticate($this->getController()->getRequest(), $this->response);
             if (!empty($result)) {
                 $this->_authenticationProvider = $auth;
                 $event = $this->dispatchEvent('Auth.afterIdentify', [$result, $auth]);
@@ -911,7 +911,9 @@ class AuthComponent extends Component
         if (!class_exists($className)) {
             throw new Exception(sprintf('Auth storage adapter "%s" was not found.', $class));
         }
-        $this->_storage = new $className($this->request, $this->response, $config);
+        $request = $this->getController()->getRequest();
+        $response = $this->getController()->getResponse();
+        $this->_storage = new $className($request, $response, $config);
 
         return $this->_storage;
     }

+ 4 - 5
src/Controller/Component/PaginatorComponent.php

@@ -266,12 +266,11 @@ class PaginatorComponent extends Component
      */
     protected function _setPagingParams()
     {
-        $request = $this->_registry->getController()->request;
+        $controller = $this->getController();
+        $request = $controller->getRequest();
+        $paging = $this->_paginator->getPagingParams() + (array)$request->getParam('paging');
 
-        $request->addParams([
-            'paging' => $this->_paginator->getPagingParams()
-                + (array)$request->getParam('paging')
-        ]);
+        $controller->setRequest($request->withParam('paging', $paging));
     }
 
     /**

+ 7 - 0
src/Http/ServerRequest.php

@@ -921,9 +921,15 @@ class ServerRequest implements ArrayAccess, ServerRequestInterface
      *
      * @param array $params Array of parameters to merge in
      * @return $this The current object, you can chain this method.
+     * @deprecated 3.6.0 ServerRequest::addParams() is deprecated. Use `withParam()` or
+     *   `withAttribute('params')` instead.
      */
     public function addParams(array $params)
     {
+        deprecationWarning(
+            'ServerRequest::addParams() is deprecated. ' .
+            'Use `withParam()` or `withAttribute("params", $params)` instead.'
+        );
         $this->params = array_merge($this->params, $params);
 
         return $this;
@@ -935,6 +941,7 @@ class ServerRequest implements ArrayAccess, ServerRequestInterface
      *
      * @param array $paths Array of paths to merge in
      * @return $this The current object, you can chain this method.
+     * @deprecated 3.6.0 Mutating a request in place is deprecated. Use `withAttribute()` to modify paths instead.
      */
     public function addPaths(array $paths)
     {

+ 1 - 5
tests/TestCase/Auth/BasicAuthenticateTest.php

@@ -129,9 +129,8 @@ class BasicAuthenticateTest extends TestCase
             'environment' => [
                 'PHP_AUTH_USER' => '> 1',
                 'PHP_AUTH_PW' => "' OR 1 = 1"
-            ]
+            ],
         ]);
-        $request->addParams(['pass' => []]);
 
         $this->assertFalse($this->auth->getUser($request));
         $this->assertFalse($this->auth->authenticate($request, $this->response));
@@ -172,7 +171,6 @@ class BasicAuthenticateTest extends TestCase
     public function testAuthenticateChallenge()
     {
         $request = new ServerRequest('posts/index');
-        $request->addParams(['pass' => []]);
 
         try {
             $this->auth->unauthenticated($request, $this->response);
@@ -199,7 +197,6 @@ class BasicAuthenticateTest extends TestCase
                 'PHP_AUTH_PW' => 'password'
             ]
         ]);
-        $request->addParams(['pass' => []]);
 
         $result = $this->auth->authenticate($request, $this->response);
         $expected = [
@@ -228,7 +225,6 @@ class BasicAuthenticateTest extends TestCase
                 'PHP_AUTH_PW' => 'password'
             ]
         ]);
-        $request->addParams(['pass' => []]);
 
         $this->auth->unauthenticated($request, $this->response);
     }

+ 1 - 10
tests/TestCase/Auth/DigestAuthenticateTest.php

@@ -113,8 +113,7 @@ class DigestAuthenticateTest extends TestCase
     {
         $this->expectException(\Cake\Http\Exception\UnauthorizedException::class);
         $this->expectExceptionCode(401);
-        $request = new ServerRequest('posts/index');
-        $request->addParams(['pass' => []]);
+        $request = new ServerRequest(['url' => 'posts/index']);
 
         $data = [
             'username' => 'incorrect_user',
@@ -142,7 +141,6 @@ class DigestAuthenticateTest extends TestCase
             'url' => 'posts/index',
             'environment' => ['REQUEST_METHOD' => 'GET']
         ]);
-        $request->addParams(['pass' => []]);
 
         try {
             $this->auth->unauthenticated($request, $this->response);
@@ -169,7 +167,6 @@ class DigestAuthenticateTest extends TestCase
             'url' => 'posts/index',
             'environment' => ['REQUEST_METHOD' => 'GET']
         ]);
-        $request->addParams(['pass' => []]);
         $data = [
             'uri' => '/dir/index.html',
             'nonce' => $this->generateNonce(null, 5, strtotime('-10 minutes')),
@@ -201,7 +198,6 @@ class DigestAuthenticateTest extends TestCase
             'url' => 'posts/index',
             'environment' => ['REQUEST_METHOD' => 'GET']
         ]);
-        $request->addParams(['pass' => []]);
 
         $data = [
             'uri' => '/dir/index.html',
@@ -227,7 +223,6 @@ class DigestAuthenticateTest extends TestCase
             'url' => 'posts/index',
             'environment' => ['REQUEST_METHOD' => 'GET']
         ]);
-        $request->addParams(['pass' => []]);
 
         $data = [
             'username' => 'mariano',
@@ -255,7 +250,6 @@ class DigestAuthenticateTest extends TestCase
             'url' => 'posts/index',
             'environment' => ['REQUEST_METHOD' => 'GET']
         ]);
-        $request->addParams(['pass' => []]);
 
         $data = [
             'uri' => '/dir/index.html',
@@ -291,7 +285,6 @@ class DigestAuthenticateTest extends TestCase
             'url' => 'posts/index',
             'environment' => ['REQUEST_METHOD' => 'GET']
         ]);
-        $request->addParams(['pass' => []]);
 
         $data = [
             'uri' => '/dir/index.html',
@@ -325,7 +318,6 @@ class DigestAuthenticateTest extends TestCase
             'post' => ['_method' => 'PUT'],
             'environment' => ['REQUEST_METHOD' => 'GET']
         ]);
-        $request->addParams(['pass' => []]);
 
         $data = [
             'username' => 'mariano',
@@ -362,7 +354,6 @@ class DigestAuthenticateTest extends TestCase
             'url' => 'posts/index',
             'environment' => ['REQUEST_METHOD' => 'GET']
         ]);
-        $request->addParams(['pass' => []]);
 
         $data = [
             'username' => 'invalid',

+ 86 - 71
tests/TestCase/Controller/Component/AuthComponentTest.php

@@ -85,6 +85,7 @@ class AuthComponentTest extends TestCase
 
         $Users = TableRegistry::get('AuthUsers');
         $Users->updateAll(['password' => password_hash('cake', PASSWORD_BCRYPT)], []);
+        $this->request = $request;
     }
 
     /**
@@ -129,7 +130,7 @@ class AuthComponentTest extends TestCase
 
         $this->Auth->setAuthenticateObject(0, $AuthLoginFormAuthenticate);
 
-        $this->Auth->request->data = [
+        $this->Controller->request->data = [
             'AuthUsers' => [
                 'username' => 'mark',
                 'password' => Security::hash('cake', null, true)
@@ -143,7 +144,7 @@ class AuthComponentTest extends TestCase
 
         $AuthLoginFormAuthenticate->expects($this->once())
             ->method('authenticate')
-            ->with($this->Auth->request)
+            ->with($this->Controller->request)
             ->will($this->returnValue($user));
 
         $result = $this->Auth->identify();
@@ -170,7 +171,7 @@ class AuthComponentTest extends TestCase
 
         $this->Auth->setAuthenticateObject(0, $AuthLoginFormAuthenticate);
 
-        $this->Auth->request->data = [
+        $this->Controller->request->data = [
             'AuthUsers' => [
                 'username' => 'mark',
                 'password' => Security::hash('cake', null, true)
@@ -184,7 +185,7 @@ class AuthComponentTest extends TestCase
 
         $AuthLoginFormAuthenticate->expects($this->once())
             ->method('authenticate')
-            ->with($this->Auth->request)
+            ->with($this->Controller->request)
             ->will($this->returnValue($user));
 
         $result = $this->Auth->identify();
@@ -206,7 +207,7 @@ class AuthComponentTest extends TestCase
         $this->Controller->Auth->storage()->write($user);
         $this->Controller->Auth->setConfig('userModel', 'Users');
         $this->Controller->Auth->setConfig('authorize', false);
-        $this->Controller->request->addParams(['controller' => 'AuthTest', 'action' => 'add']);
+        $this->Controller->request = $this->request->withAttribute('params', ['controller' => 'AuthTest', 'action' => 'add']);
         $result = $this->Controller->Auth->startup($event);
         $this->assertNull($result);
 
@@ -216,7 +217,7 @@ class AuthComponentTest extends TestCase
         $this->assertInstanceOf('Cake\Http\Response', $result);
         $this->assertTrue($this->Auth->session->check('Flash.flash'));
 
-        $this->Controller->request->addParams(['controller' => 'AuthTest', 'action' => 'camelCase']);
+        $this->Controller->request = $this->request->withAttribute('params', ['controller' => 'AuthTest', 'action' => 'camelCase']);
         $result = $this->Controller->Auth->startup($event);
         $this->assertInstanceOf('Cake\Http\Response', $result);
     }
@@ -256,7 +257,7 @@ class AuthComponentTest extends TestCase
         $this->Auth->setAuthorizeObject(0, $AuthMockOneAuthorize);
         $this->Auth->setAuthorizeObject(1, $AuthMockTwoAuthorize);
         $this->Auth->setAuthorizeObject(2, $AuthMockThreeAuthorize);
-        $request = $this->Auth->request;
+        $request = $this->Controller->request;
 
         $AuthMockOneAuthorize->expects($this->once())
             ->method('authorize')
@@ -288,7 +289,7 @@ class AuthComponentTest extends TestCase
             ->getMock();
 
         $this->Auth->setAuthorizeObject(0, $AuthMockOneAuthorize);
-        $request = $this->Auth->request;
+        $request = $this->Controller->request;
 
         $user = new \ArrayObject(['User']);
 
@@ -496,14 +497,18 @@ class AuthComponentTest extends TestCase
         $this->Controller->Auth->deny(['add', 'camelCase']);
 
         $url = '/auth_test/camelCase';
-        $this->Controller->request->addParams(['controller' => 'AuthTest', 'action' => 'camelCase']);
-        $this->Controller->request->query['url'] = Router::normalize($url);
+        $this->Controller->request = $this->request->withAttribute(
+            'params',
+            ['controller' => 'AuthTest', 'action' => 'camelCase']
+        )->withQueryParams(['url' => Router::normalize($url)]);
 
         $this->assertInstanceOf('Cake\Http\Response', $this->Controller->Auth->startup($event));
 
         $url = '/auth_test/CamelCase';
-        $this->Controller->request->addParams(['controller' => 'AuthTest', 'action' => 'camelCase']);
-        $this->Controller->request->query['url'] = Router::normalize($url);
+        $this->Controller->request = $this->request->withAttribute(
+            'params',
+            ['controller' => 'AuthTest', 'action' => 'camelCase']
+        )->withQueryParams(['url' => Router::normalize($url)]);
         $this->assertInstanceOf('Cake\Http\Response', $this->Controller->Auth->startup($event));
     }
 
@@ -517,8 +522,9 @@ class AuthComponentTest extends TestCase
     {
         $event = new Event('Controller.startup', $this->Controller);
         $url = '/auth_test/camelCase';
-        $this->Controller->request->addParams(['controller' => 'AuthTest', 'action' => 'camelCase']);
-        $this->Controller->request->query['url'] = Router::normalize($url);
+        $this->Controller->request = $this->request
+            ->withAttribute('params', ['controller' => 'AuthTest', 'action' => 'camelCase'])
+            ->withRequestTarget($url);
         $this->Controller->Auth->loginAction = ['controller' => 'AuthTest', 'action' => 'login'];
         $this->Controller->Auth->userModel = 'AuthUsers';
         $this->Controller->Auth->allow();
@@ -526,8 +532,9 @@ class AuthComponentTest extends TestCase
         $this->assertNull($result, 'startup() should return null, as action is allowed. %s');
 
         $url = '/auth_test/camelCase';
-        $this->Controller->request->addParams(['controller' => 'AuthTest', 'action' => 'camelCase']);
-        $this->Controller->request->query['url'] = Router::normalize($url);
+        $this->Controller->request = $this->request
+            ->withAttribute('params', ['controller' => 'AuthTest', 'action' => 'camelCase'])
+            ->withRequestTarget($url);
         $this->Controller->Auth->loginAction = ['controller' => 'AuthTest', 'action' => 'login'];
         $this->Controller->Auth->userModel = 'AuthUsers';
         $this->Controller->Auth->allowedActions = ['delete', 'camelCase', 'add'];
@@ -538,8 +545,9 @@ class AuthComponentTest extends TestCase
         $this->assertInstanceOf('Cake\Http\Response', $this->Controller->Auth->startup($event));
 
         $url = '/auth_test/delete';
-        $this->Controller->request->addParams(['controller' => 'AuthTest', 'action' => 'delete']);
-        $this->Controller->request->query['url'] = Router::normalize($url);
+        $this->Controller->request = $this->request
+            ->withAttribute('params', ['controller' => 'AuthTest', 'action' => 'delete'])
+            ->withRequestTarget($url);
         $this->Controller->Auth->loginAction = ['controller' => 'AuthTest', 'action' => 'login'];
         $this->Controller->Auth->userModel = 'AuthUsers';
 
@@ -556,8 +564,8 @@ class AuthComponentTest extends TestCase
     public function testAllowedActionsSetWithAllowMethod()
     {
         $url = '/auth_test/action_name';
-        $this->Controller->request->addParams(['controller' => 'AuthTest', 'action' => 'action_name']);
-        $this->Controller->request->query['url'] = Router::normalize($url);
+        $this->Controller->request = $this->request
+            ->withAttribute('params', ['controller' => 'AuthTest', 'action' => 'action_name']);
         $this->Controller->Auth->allow(['action_name', 'anotherAction']);
         $this->assertEquals(['action_name', 'anotherAction'], $this->Controller->Auth->allowedActions);
     }
@@ -574,7 +582,7 @@ class AuthComponentTest extends TestCase
             'AuthUsers' => ['id' => '1', 'username' => 'nate']
         ]);
 
-        $this->Auth->request = $this->Controller->request = new ServerRequest([
+        $this->Controller->request = $this->Controller->request = new ServerRequest([
             'params' => ['controller' => 'Users', 'action' => 'login'],
             'url' => '/users/login',
             'environment' => ['HTTP_REFERER' => false],
@@ -597,7 +605,7 @@ class AuthComponentTest extends TestCase
             'Auth',
             ['AuthUsers' => ['id' => '1', 'username' => 'nate']]
         );
-        $this->Auth->request = $this->Controller->request = new ServerRequest([
+        $this->Controller->request = $this->Controller->request = new ServerRequest([
             'params' => ['controller' => 'Posts', 'action' => 'view', 'pass' => [1]],
             'url' => '/posts/view/1',
             'environment' => ['HTTP_REFERER' => false, 'REQUEST_METHOD' => 'GET'],
@@ -622,7 +630,7 @@ class AuthComponentTest extends TestCase
         // Auth.redirect gets set when accessing a protected action without being authenticated
         $this->Auth->session->delete('Auth');
 
-        $this->Auth->request = $this->Controller->request = new ServerRequest([
+        $this->Controller->request = $this->Controller->request = new ServerRequest([
             'params' => ['controller' => 'Posts', 'action' => 'view', 'pass' => [1]],
             'url' => '/posts/view/1',
             'environment' => ['HTTP_REFERER' => false, 'REQUEST_METHOD' => 'GET'],
@@ -646,7 +654,7 @@ class AuthComponentTest extends TestCase
     public function testLoginRedirectPost()
     {
         $this->Auth->session->delete('Auth');
-        $this->Auth->request = new ServerRequest([
+        $this->Controller->request = new ServerRequest([
             'environment' => [
                 'HTTP_REFERER' => Router::url('/foo/bar', true),
                 'REQUEST_METHOD' => 'POST'
@@ -673,7 +681,7 @@ class AuthComponentTest extends TestCase
     public function testLoginRedirectPostNoReferer()
     {
         $this->Auth->session->delete('Auth');
-        $this->Auth->request = new ServerRequest([
+        $this->Controller->request = new ServerRequest([
             'environment' => ['REQUEST_METHOD' => 'POST'],
             'params' => ['controller' => 'Posts', 'action' => 'view', 'pass' => [1]],
             'url' => '/posts/view/1?print=true&refer=menu',
@@ -696,7 +704,7 @@ class AuthComponentTest extends TestCase
     {
         // QueryString parameters are preserved when redirecting with redirect key
         $this->Auth->session->delete('Auth');
-        $this->Auth->request = new ServerRequest([
+        $this->Controller->request = new ServerRequest([
             'environment' => ['REQUEST_METHOD' => 'GET'],
             'params' => ['controller' => 'Posts', 'action' => 'view', 'pass' => [29]],
             'url' => '/posts/view/29?print=true&refer=menu',
@@ -722,7 +730,7 @@ class AuthComponentTest extends TestCase
     public function testLoginRedirectQueryStringWithComplexLoginActionUrl()
     {
         $this->Auth->session->delete('Auth');
-        $this->Auth->request = new ServerRequest([
+        $this->Controller->request = new ServerRequest([
             'environment' => ['REQUEST_METHOD' => 'GET'],
             'params' => ['controller' => 'Posts', 'action' => 'view', 'pass' => [29]],
             'url' => '/posts/view/29?print=true&refer=menu',
@@ -832,7 +840,7 @@ class AuthComponentTest extends TestCase
     public function testDefaultToLoginRedirect()
     {
         $url = '/party/on';
-        $this->Auth->request = $request = new ServerRequest([
+        $this->Controller->request = $request = new ServerRequest([
             'url' => $url,
             'environment' => [
                 'HTTP_REFERER' => false,
@@ -882,11 +890,11 @@ class AuthComponentTest extends TestCase
             ->setMethods(['set'])
             ->setConstructorArgs([$this->Controller->components()])
             ->getMock();
-        $this->Auth->request = $request = new ServerRequest([
+        $request = new ServerRequest([
             'url' => $url,
-            'session' => $this->Auth->session
+            'session' => $this->Auth->session,
+            'params' => ['controller' => 'Party', 'action' => 'on']
         ]);
-        $this->Auth->request->addParams(['controller' => 'Party', 'action' => 'on']);
         $this->Auth->setConfig('authorize', ['Controller']);
         $this->Auth->setUser(['username' => 'admad', 'password' => 'cake']);
 
@@ -894,19 +902,19 @@ class AuthComponentTest extends TestCase
         $this->Auth->setConfig('unauthorizedRedirect', $expected);
 
         $response = new Response();
-        $Controller = $this->getMockBuilder('Cake\Controller\Controller')
+        $controller = $this->getMockBuilder('Cake\Controller\Controller')
             ->setMethods(['on', 'redirect'])
             ->setConstructorArgs([$request, $response])
             ->getMock();
 
-        $Controller->expects($this->once())
+        $controller->expects($this->once())
             ->method('redirect')
             ->with($this->equalTo($expected));
 
         $this->Auth->Flash->expects($this->once())
             ->method('set');
 
-        $event = new Event('Controller.startup', $Controller);
+        $event = new Event('Controller.startup', $controller);
         $this->Auth->startup($event);
     }
 
@@ -923,11 +931,11 @@ class AuthComponentTest extends TestCase
             ->setMethods(['set'])
             ->setConstructorArgs([$this->Controller->components()])
             ->getMock();
-        $this->Auth->request = $request = new ServerRequest([
+        $request = new ServerRequest([
             'url' => $url,
-            'session' => $this->Auth->session
+            'session' => $this->Auth->session,
+            'params' => ['controller' => 'Party', 'action' => 'on']
         ]);
-        $this->Auth->request->addParams(['controller' => 'Party', 'action' => 'on']);
         $this->Auth->setConfig('authorize', ['Controller']);
         $this->Auth->setUser(['username' => 'admad', 'password' => 'cake']);
 
@@ -935,17 +943,17 @@ class AuthComponentTest extends TestCase
         $this->Auth->setConfig('loginAction', '/users/login');
 
         $response = new Response();
-        $Controller = $this->getMockBuilder('Cake\Controller\Controller')
+        $controller = $this->getMockBuilder('Cake\Controller\Controller')
             ->setMethods(['on', 'redirect'])
             ->setConstructorArgs([$request, $response])
             ->getMock();
 
         // Uses referrer instead of loginAction.
-        $Controller->expects($this->once())
+        $controller->expects($this->once())
             ->method('redirect')
             ->with($this->equalTo('/'));
 
-        $event = new Event('Controller.startup', $Controller);
+        $event = new Event('Controller.startup', $controller);
         $this->Auth->startup($event);
     }
 
@@ -961,28 +969,30 @@ class AuthComponentTest extends TestCase
         $this->Auth->session = $this->getMockBuilder(Session::class)
             ->setMethods(['flash'])
             ->getMock();
-        $this->Auth->request = $Request = new ServerRequest($url);
-        $this->Auth->request->addParams(['controller' => 'Party', 'action' => 'on']);
+        $request = new ServerRequest([
+            'url' => $url,
+            'params' => ['controller' => 'Party', 'action' => 'on']
+        ]);
         $this->Auth->setConfig('authorize', ['Controller']);
         $this->Auth->setUser(['username' => 'admad', 'password' => 'cake']);
         $expected = ['controller' => 'no_can_do', 'action' => 'jack'];
         $this->Auth->setConfig('unauthorizedRedirect', $expected);
         $this->Auth->setConfig('authError', false);
 
-        $Response = new Response();
-        $Controller = $this->getMockBuilder('Cake\Controller\Controller')
+        $response = new Response();
+        $controller = $this->getMockBuilder('Cake\Controller\Controller')
             ->setMethods(['on', 'redirect'])
-            ->setConstructorArgs([$Request, $Response])
+            ->setConstructorArgs([$request, $response])
             ->getMock();
 
-        $Controller->expects($this->once())
+        $controller->expects($this->once())
             ->method('redirect')
             ->with($this->equalTo($expected));
 
         $this->Auth->session->expects($this->never())
             ->method('flash');
 
-        $event = new Event('Controller.startup', $Controller);
+        $event = new Event('Controller.startup', $controller);
         $this->Auth->startup($event);
     }
 
@@ -995,15 +1005,15 @@ class AuthComponentTest extends TestCase
     public function testForbiddenException()
     {
         $this->expectException(\Cake\Http\Exception\ForbiddenException::class);
-        $url = '/party/on';
-        $this->Auth->request = $request = new ServerRequest($url);
-        $this->Auth->request->addParams(['controller' => 'Party', 'action' => 'on']);
         $this->Auth->setConfig([
             'authorize' => ['Controller'],
             'unauthorizedRedirect' => false
         ]);
         $this->Auth->setUser(['username' => 'baker', 'password' => 'cake']);
 
+        $request = $this->request
+            ->withAttribute('params', ['controller' => 'Party', 'action' => 'on'])
+            ->withRequestTarget('/party/on');
         $response = new Response();
         $Controller = $this->getMockBuilder('Cake\Controller\Controller')
             ->setMethods(['on', 'redirect'])
@@ -1029,8 +1039,10 @@ class AuthComponentTest extends TestCase
         $controller->methods = ['login'];
 
         $url = '/AuthTest/login';
-        $this->Auth->request = $controller->request = new ServerRequest($url);
-        $this->Auth->request->addParams(['controller' => 'AuthTest', 'action' => 'login']);
+        $this->Controller->request = $this->request
+            ->withAttribute('params', ['controller' => 'AuthTest', 'action' => 'login'])
+            ->withRequestTarget($url);
+
         $this->Auth->setConfig([
             'loginAction', ['controller' => 'AuthTest', 'action' => 'login'],
             'authorize', ['Controller']
@@ -1053,7 +1065,10 @@ class AuthComponentTest extends TestCase
     {
         $event = new Event('Controller.startup', $this->Controller);
         $this->Auth->session->delete('Auth');
-        $this->Auth->request->addParams(['controller' => 'AuthTest', 'action' => 'something_totally_wrong']);
+        $this->Controller->request = $this->request->withAttribute(
+            'params',
+            ['controller' => 'AuthTest', 'action' => 'something_totally_wrong']
+        );
         $result = $this->Auth->startup($event);
         $this->assertNull($result, 'Auth redirected a missing action %s');
     }
@@ -1074,7 +1089,7 @@ class AuthComponentTest extends TestCase
         Router::scope('/', function ($routes) {
             $routes->fallbacks(InflectedRoute::class);
         });
-        $this->Auth->request = new ServerRequest([
+        $this->Controller->request = new ServerRequest([
             'environment' => [
                 'REQUEST_METHOD' => 'GET',
             ],
@@ -1088,7 +1103,7 @@ class AuthComponentTest extends TestCase
             'session' => $this->Auth->session
         ]);
 
-        Router::setRequestInfo($this->Auth->request);
+        Router::setRequestInfo($this->Controller->request);
 
         $this->Auth->setConfig('loginAction', [
             'prefix' => 'admin',
@@ -1208,7 +1223,7 @@ class AuthComponentTest extends TestCase
     public function testStatelessAuthWorksWithUser()
     {
         $event = new Event('Controller.startup', $this->Controller);
-        $this->Auth->request = new ServerRequest([
+        $this->Controller->request = new ServerRequest([
             'environment' => [
                 'REQUEST_METHOD' => 'POST',
                 'PHP_AUTH_USER' => 'mariano',
@@ -1320,7 +1335,7 @@ class AuthComponentTest extends TestCase
     {
         $event = new Event('Controller.startup', $this->Controller);
         $url = '/auth_test/add';
-        $this->Auth->request = $this->Auth->request
+        $this->Controller->request = $this->Controller->request
             ->withParam('controller', 'AuthTest')
             ->withParam('action', 'add')
             ->withEnv('PHP_AUTH_USER', 'mariano')
@@ -1352,7 +1367,7 @@ class AuthComponentTest extends TestCase
     {
         $storage = $this->getMockBuilder('Cake\Auth\Storage\SessionStorage')
             ->setMethods(['write'])
-            ->setConstructorArgs([$this->Auth->request, $this->Auth->response])
+            ->setConstructorArgs([$this->Controller->request, $this->Auth->response])
             ->getMock();
         $this->Auth->storage($storage);
 
@@ -1446,7 +1461,7 @@ class AuthComponentTest extends TestCase
     public function testRedirectQueryStringRead()
     {
         $this->Auth->setConfig('loginAction', ['controller' => 'users', 'action' => 'login']);
-        $this->Auth->request->query = ['redirect' => '/users/custom'];
+        $this->Controller->request->query = ['redirect' => '/users/custom'];
 
         $result = $this->Auth->redirectUrl();
         $this->assertEquals('/users/custom', $result);
@@ -1459,12 +1474,12 @@ class AuthComponentTest extends TestCase
      */
     public function testRedirectQueryStringReadDuplicateBase()
     {
-        $this->Auth->request->webroot = '/waves/';
-        $this->Auth->request->base = '/waves';
+        $this->Controller->request->webroot = '/waves/';
+        $this->Controller->request->base = '/waves';
 
-        $this->Auth->request->query = ['redirect' => '/waves/add'];
+        $this->Controller->request->query = ['redirect' => '/waves/add'];
 
-        Router::setRequestInfo($this->Auth->request);
+        Router::setRequestInfo($this->Controller->request);
 
         $result = $this->Auth->redirectUrl();
         $this->assertEquals('/waves/add', $result);
@@ -1482,7 +1497,7 @@ class AuthComponentTest extends TestCase
             'loginAction' => ['controller' => 'users', 'action' => 'login'],
             'loginRedirect' => ['controller' => 'users', 'action' => 'home']
         ]);
-        $this->Auth->request->query = ['redirect' => '/users/login'];
+        $this->Controller->request->query = ['redirect' => '/users/login'];
 
         $result = $this->Auth->redirectUrl();
         $this->assertEquals('/users/home', $result);
@@ -1500,12 +1515,12 @@ class AuthComponentTest extends TestCase
             'loginAction' => ['controller' => 'users', 'action' => 'login'],
             'loginRedirect' => ['controller' => 'users', 'action' => 'home']
         ]);
-        $this->Auth->request->query = ['redirect' => 'http://some.domain.example/users/login'];
+        $this->Controller->request->query = ['redirect' => 'http://some.domain.example/users/login'];
 
         $result = $this->Auth->redirectUrl();
         $this->assertEquals('/users/home', $result);
 
-        $this->Auth->request->query = ['redirect' => '//some.domain.example/users/login'];
+        $this->Controller->request->query = ['redirect' => '//some.domain.example/users/login'];
 
         $result = $this->Auth->redirectUrl();
         $this->assertEquals('/users/home', $result);
@@ -1528,11 +1543,11 @@ class AuthComponentTest extends TestCase
         ]);
 
         $url = '/users/login';
-        $this->Auth->request = $this->Controller->request = new ServerRequest($url);
-        $this->Auth->request->addParams(['controller' => 'Users', 'action' => 'login']);
-        $this->Auth->request->url = Router::normalize($url);
-
-        Router::setRequestInfo($this->Auth->request);
+        $this->Controller->request = $this->Controller->request = new ServerRequest([
+            'url' => $url,
+            'params' => ['plugin' => null, 'controller' => 'Users', 'action' => 'login']
+        ]);
+        Router::setRequestInfo($this->Controller->request);
 
         $this->Auth->setConfig('loginAction', ['controller' => 'users', 'action' => 'login']);
         $this->Auth->setConfig('loginRedirect', ['controller' => 'users', 'action' => 'home']);

+ 50 - 49
tests/TestCase/Controller/Component/PaginatorComponentTest.php

@@ -80,10 +80,9 @@ class PaginatorComponentTest extends TestCase
 
         static::setAppNamespace();
 
-        $this->request = new ServerRequest('controller_posts/index');
-        $this->request->params['pass'] = [];
-        $controller = new Controller($this->request);
-        $this->registry = new ComponentRegistry($controller);
+        $request = new ServerRequest(['url' => 'controller_posts/index']);
+        $this->controller = new Controller($request);
+        $this->registry = new ComponentRegistry($this->controller);
         $this->Paginator = new PaginatorComponent($this->registry, []);
 
         $this->Post = $this->getMockRepository();
@@ -151,10 +150,10 @@ class PaginatorComponentTest extends TestCase
             ->method('find')
             ->will($this->returnValue($query));
 
-        $this->request->query = ['page' => '1 " onclick="alert(\'xss\');">'];
+        $this->controller->request = $this->controller->request->withQueryParams(['page' => '1 " onclick="alert(\'xss\');">']);
         $settings = ['limit' => 1, 'maxLimit' => 10];
         $this->Paginator->paginate($this->Post, $settings);
-        $this->assertSame(1, $this->request->params['paging']['Posts']['page'], 'XSS exploit opened');
+        $this->assertSame(1, $this->controller->request->getParam('paging.Posts.page'), 'XSS exploit opened');
     }
 
     /**
@@ -165,7 +164,7 @@ class PaginatorComponentTest extends TestCase
      */
     public function testPaginateExtraParams()
     {
-        $this->request->query = ['page' => '-1'];
+        $this->controller->request = $this->controller->request->withQueryParams(['page' => '-1']);
         $settings = [
             'PaginatorPosts' => [
                 'contain' => ['PaginatorAuthor'],
@@ -245,7 +244,7 @@ class PaginatorComponentTest extends TestCase
             ->will($this->returnValue($query));
 
         $this->Paginator->paginate($table, $settings);
-        $this->assertEquals('popular', $this->request->params['paging']['PaginatorPosts']['finder']);
+        $this->assertEquals('popular', $this->controller->request->getParam('paging.PaginatorPosts.finder'));
     }
 
     /**
@@ -338,8 +337,8 @@ class PaginatorComponentTest extends TestCase
             ]);
 
         $this->Paginator->paginate($table, $settings);
-        $this->assertEquals('PaginatorPosts.id', $this->request->params['paging']['PaginatorPosts']['sortDefault']);
-        $this->assertEquals('DESC', $this->request->params['paging']['PaginatorPosts']['directionDefault']);
+        $this->assertEquals('PaginatorPosts.id', $this->controller->request->getParam('paging.PaginatorPosts.sortDefault'));
+        $this->assertEquals('DESC', $this->controller->request->getParam('paging.PaginatorPosts.directionDefault'));
     }
 
     /**
@@ -375,14 +374,14 @@ class PaginatorComponentTest extends TestCase
      */
     public function testMergeOptionsCustomScope()
     {
-        $this->request->query = [
+        $this->controller->request = $this->controller->request->withQueryParams([
             'page' => 10,
             'limit' => 10,
             'scope' => [
                 'page' => 2,
                 'limit' => 5,
             ]
-        ];
+        ]);
 
         $settings = [
             'page' => 1,
@@ -444,10 +443,10 @@ class PaginatorComponentTest extends TestCase
      */
     public function testMergeOptionsCustomFindKey()
     {
-        $this->request->query = [
+        $this->controller->request = $this->controller->request->withQueryParams([
             'page' => 10,
             'limit' => 10
-        ];
+        ]);
         $settings = [
             'page' => 1,
             'limit' => 20,
@@ -472,10 +471,10 @@ class PaginatorComponentTest extends TestCase
      */
     public function testMergeOptionsQueryString()
     {
-        $this->request->query = [
+        $this->controller->request = $this->controller->request->withQueryParams([
             'page' => 99,
             'limit' => 75
-        ];
+        ]);
         $settings = [
             'page' => 1,
             'limit' => 20,
@@ -493,14 +492,14 @@ class PaginatorComponentTest extends TestCase
      */
     public function testMergeOptionsDefaultWhiteList()
     {
-        $this->request->query = [
+        $this->controller->request = $this->controller->request->withQueryParams([
             'page' => 10,
             'limit' => 10,
             'fields' => ['bad.stuff'],
             'recursive' => 1000,
             'conditions' => ['bad.stuff'],
             'contain' => ['bad']
-        ];
+        ]);
         $settings = [
             'page' => 1,
             'limit' => 20,
@@ -518,14 +517,14 @@ class PaginatorComponentTest extends TestCase
      */
     public function testMergeOptionsExtraWhitelist()
     {
-        $this->request->query = [
+        $this->controller->request = $this->controller->request->withQueryParams([
             'page' => 10,
             'limit' => 10,
             'fields' => ['bad.stuff'],
             'recursive' => 1000,
             'conditions' => ['bad.stuff'],
             'contain' => ['bad']
-        ];
+        ]);
         $settings = [
             'page' => 1,
             'limit' => 20,
@@ -646,14 +645,14 @@ class PaginatorComponentTest extends TestCase
                 'scope' => null,
             ]);
 
-        $this->request->query = [
+        $this->controller->request = $this->controller->request->withQueryParams([
             'page' => 1,
             'sort' => 'id',
             'direction' => 'herp'
-        ];
+        ]);
         $this->Paginator->paginate($table);
-        $this->assertEquals('PaginatorPosts.id', $this->request->params['paging']['PaginatorPosts']['sort']);
-        $this->assertEquals('asc', $this->request->params['paging']['PaginatorPosts']['direction']);
+        $this->assertEquals('PaginatorPosts.id', $this->controller->request->getParam('paging.PaginatorPosts.sort'));
+        $this->assertEquals('asc', $this->controller->request->getParam('paging.PaginatorPosts.direction'));
     }
 
     /**
@@ -693,17 +692,17 @@ class PaginatorComponentTest extends TestCase
 
         $this->assertSame(
             0,
-            $this->request->params['paging']['PaginatorPosts']['count'],
+            $this->controller->request->getParam('paging.PaginatorPosts.count'),
             'Count should be 0'
         );
         $this->assertSame(
             1,
-            $this->request->params['paging']['PaginatorPosts']['page'],
+            $this->controller->request->getParam('paging.PaginatorPosts.page'),
             'Page number should not be 0'
         );
         $this->assertSame(
             1,
-            $this->request->params['paging']['PaginatorPosts']['pageCount'],
+            $this->controller->request->getParam('paging.PaginatorPosts.pageCount'),
             'Page count number should not be 0'
         );
     }
@@ -716,7 +715,7 @@ class PaginatorComponentTest extends TestCase
     public function testOutOfRangePageNumberGetsClamped()
     {
         $this->loadFixtures('Posts');
-        $this->request->query['page'] = 3000;
+        $this->controller->request = $this->controller->request->withQueryParams(['page' => 3000]);
 
         $table = TableRegistry::get('PaginatorPosts');
 
@@ -728,7 +727,7 @@ class PaginatorComponentTest extends TestCase
 
         $this->assertEquals(
             1,
-            $this->request->params['paging']['PaginatorPosts']['page'],
+            $this->controller->request->getParam('paging.PaginatorPosts.page'),
             'Page number should not be 0'
         );
 
@@ -744,8 +743,10 @@ class PaginatorComponentTest extends TestCase
     public function testOutOfRangePageNumberStillProvidesPageCount()
     {
         $this->loadFixtures('Posts');
-        $this->request->query['limit'] = 1;
-        $this->request->query['page'] = 4;
+        $this->controller->request = $this->controller->request->withQueryParams([
+            'limit' => 1,
+            'page' => '4',
+        ]);
 
         $table = TableRegistry::get('PaginatorPosts');
 
@@ -757,7 +758,7 @@ class PaginatorComponentTest extends TestCase
 
         $this->assertEquals(
             3,
-            $this->request->params['paging']['PaginatorPosts']['pageCount'],
+            $this->controller->request->getParam('paging.PaginatorPosts.pageCount'),
             'Page count number should not be 0'
         );
 
@@ -774,9 +775,9 @@ class PaginatorComponentTest extends TestCase
     {
         $this->expectException(\Cake\Http\Exception\NotFoundException::class);
         $this->loadFixtures('Posts');
-        $this->request->query = [
+        $this->controller->request = $this->controller->request->withQueryParams([
             'page' => '3000000000000000000000000',
-        ];
+        ]);
 
         $table = TableRegistry::get('PaginatorPosts');
         $this->Paginator->paginate($table);
@@ -1084,19 +1085,19 @@ class PaginatorComponentTest extends TestCase
         $settings = [
             'maxLimit' => 100,
         ];
-        $this->request->query = [
+        $this->controller->request = $this->controller->request->withQueryParams([
             'limit' => '1000'
-        ];
+        ]);
         $this->Paginator->paginate($table, $settings);
-        $this->assertEquals(100, $this->request->params['paging']['PaginatorPosts']['limit']);
-        $this->assertEquals(100, $this->request->params['paging']['PaginatorPosts']['perPage']);
+        $this->assertEquals(100, $this->controller->request->getParam('paging.PaginatorPosts.limit'));
+        $this->assertEquals(100, $this->controller->request->getParam('paging.PaginatorPosts.perPage'));
 
-        $this->request->query = [
+        $this->controller->request = $this->controller->request->withQueryParams([
             'limit' => '10'
-        ];
+        ]);
         $this->Paginator->paginate($table, $settings);
-        $this->assertEquals(10, $this->request->params['paging']['PaginatorPosts']['limit']);
-        $this->assertEquals(10, $this->request->params['paging']['PaginatorPosts']['perPage']);
+        $this->assertEquals(10, $this->controller->request->getParam('paging.PaginatorPosts.limit'));
+        $this->assertEquals(10, $this->controller->request->getParam('paging.PaginatorPosts.perPage'));
     }
 
     /**
@@ -1125,7 +1126,7 @@ class PaginatorComponentTest extends TestCase
         $this->assertCount(4, $result, '4 rows should come back');
         $this->assertEquals(['First Post', 'Second Post', 'Third Post', 'Fourth Post'], $titleExtractor($result));
 
-        $result = $this->request->params['paging']['PaginatorPosts'];
+        $result = $this->controller->request->getParam('paging.PaginatorPosts');
         $this->assertEquals(4, $result['current']);
         $this->assertEquals(4, $result['count']);
 
@@ -1134,7 +1135,7 @@ class PaginatorComponentTest extends TestCase
         $this->assertCount(3, $result, '3 rows should come back');
         $this->assertEquals(['First Post', 'Second Post', 'Third Post'], $titleExtractor($result));
 
-        $result = $this->request->params['paging']['PaginatorPosts'];
+        $result = $this->controller->request->getParam('paging.PaginatorPosts');
         $this->assertEquals(3, $result['current']);
         $this->assertEquals(3, $result['count']);
 
@@ -1143,7 +1144,7 @@ class PaginatorComponentTest extends TestCase
         $this->assertCount(1, $result, '1 rows should come back');
         $this->assertEquals(['Third Post'], $titleExtractor($result));
 
-        $result = $this->request->params['paging']['PaginatorPosts'];
+        $result = $this->controller->request->getParam('paging.PaginatorPosts');
         $this->assertEquals(1, $result['current']);
         $this->assertEquals(3, $result['count']);
         $this->assertEquals(2, $result['pageCount']);
@@ -1153,7 +1154,7 @@ class PaginatorComponentTest extends TestCase
         $this->assertCount(2, $result, '2 rows should come back');
         $this->assertEquals(['First Post', 'Second Post'], $titleExtractor($result));
 
-        $result = $this->request->params['paging']['PaginatorPosts'];
+        $result = $this->controller->request->getParam('paging.PaginatorPosts');
         $this->assertEquals(2, $result['current']);
         $this->assertEquals(3, $result['count']);
         $this->assertEquals(2, $result['pageCount']);
@@ -1189,7 +1190,7 @@ class PaginatorComponentTest extends TestCase
         ];
         $this->assertEquals($expected, $result);
 
-        $result = $this->request->params['paging']['PaginatorPosts'];
+        $result = $this->controller->request->getParam('paging.PaginatorPosts');
         $this->assertEquals(2, $result['current']);
         $this->assertEquals(3, $result['count']);
         $this->assertEquals(2, $result['pageCount']);
@@ -1235,7 +1236,7 @@ class PaginatorComponentTest extends TestCase
      */
     public function testPaginateQuery()
     {
-        $this->request->query = ['page' => '-1'];
+        $this->controller->request = $this->controller->request->withQueryParams(['page' => '-1']);
         $settings = [
             'PaginatorPosts' => [
                 'contain' => ['PaginatorAuthor'],
@@ -1293,7 +1294,7 @@ class PaginatorComponentTest extends TestCase
      */
     public function testPaginateQueryWithLimit()
     {
-        $this->request->query = ['page' => '-1'];
+        $this->controller->request->query = ['page' => '-1'];
         $settings = [
             'PaginatorPosts' => [
                 'contain' => ['PaginatorAuthor'],

+ 9 - 9
tests/TestCase/Controller/Component/SecurityComponentTest.php

@@ -215,11 +215,11 @@ class SecurityComponentTest extends TestCase
         $this->expectException(\Cake\Http\Exception\BadRequestException::class);
         $request = new ServerRequest([
             'url' => 'posts/index',
-            'session' => $this->Security->session
-        ]);
-        $request->addParams([
-            'controller' => 'posts',
-            'action' => 'index'
+            'session' => $this->Security->session,
+            'params' => [
+                'controller' => 'posts',
+                'action' => 'index'
+            ]
         ]);
         $Controller = new \TestApp\Controller\SomePagesController($request);
         $event = new Event('Controller.startup', $Controller);
@@ -240,10 +240,10 @@ class SecurityComponentTest extends TestCase
      */
     public function testExceptionWhenActionIsBlackholeCallback()
     {
-        $this->Controller->request->addParams([
-            'controller' => 'posts',
-            'action' => 'fail'
-        ]);
+        $this->Controller->request = $this->Controller->request
+            ->withParam('controller', 'posts')
+            ->withParam('action', 'fail');
+
         $event = new Event('Controller.startup', $this->Controller);
         $this->assertFalse($this->Controller->failed);
         $this->Controller->Security->startup($event);

+ 39 - 27
tests/TestCase/Controller/ControllerTest.php

@@ -812,8 +812,10 @@ class ControllerTest extends TestCase
     {
         $this->expectException(\Cake\Controller\Exception\MissingActionException::class);
         $this->expectExceptionMessage('Action TestController::missing() could not be found, or is not accessible.');
-        $url = new ServerRequest('test/missing');
-        $url->addParams(['controller' => 'Test', 'action' => 'missing']);
+        $url = new ServerRequest([
+            'url' => 'test/missing',
+            'params' => ['controller' => 'Test', 'action' => 'missing']
+        ]);
         $response = $this->getMockBuilder('Cake\Http\Response')->getMock();
 
         $Controller = new TestController($url, $response);
@@ -829,8 +831,10 @@ class ControllerTest extends TestCase
     {
         $this->expectException(\Cake\Controller\Exception\MissingActionException::class);
         $this->expectExceptionMessage('Action TestController::private_m() could not be found, or is not accessible.');
-        $url = new ServerRequest('test/private_m/');
-        $url->addParams(['controller' => 'Test', 'action' => 'private_m']);
+        $url = new ServerRequest([
+            'url' => 'test/private_m/',
+            'params' => ['controller' => 'Test', 'action' => 'private_m']
+        ]);
         $response = $this->getMockBuilder('Cake\Http\Response')->getMock();
 
         $Controller = new TestController($url, $response);
@@ -846,8 +850,10 @@ class ControllerTest extends TestCase
     {
         $this->expectException(\Cake\Controller\Exception\MissingActionException::class);
         $this->expectExceptionMessage('Action TestController::protected_m() could not be found, or is not accessible.');
-        $url = new ServerRequest('test/protected_m/');
-        $url->addParams(['controller' => 'Test', 'action' => 'protected_m']);
+        $url = new ServerRequest([
+            'url' => 'test/protected_m/',
+            'params' => ['controller' => 'Test', 'action' => 'protected_m']
+        ]);
         $response = $this->getMockBuilder('Cake\Http\Response')->getMock();
 
         $Controller = new TestController($url, $response);
@@ -863,8 +869,10 @@ class ControllerTest extends TestCase
     {
         $this->expectException(\Cake\Controller\Exception\MissingActionException::class);
         $this->expectExceptionMessage('Action TestController::redirect() could not be found, or is not accessible.');
-        $url = new ServerRequest('test/redirect/');
-        $url->addParams(['controller' => 'Test', 'action' => 'redirect']);
+        $url = new ServerRequest([
+            'url' => 'test/redirect/',
+            'params' => ['controller' => 'Test', 'action' => 'redirect']
+        ]);
         $response = $this->getMockBuilder('Cake\Http\Response')->getMock();
 
         $Controller = new TestController($url, $response);
@@ -878,11 +886,13 @@ class ControllerTest extends TestCase
      */
     public function testInvokeActionReturnValue()
     {
-        $url = new ServerRequest('test/returner/');
-        $url->addParams([
-            'controller' => 'Test',
-            'action' => 'returner',
-            'pass' => []
+        $url = new ServerRequest([
+            'url' => 'test/returner/',
+            'params' => [
+                'controller' => 'Test',
+                'action' => 'returner',
+                'pass' => []
+            ]
         ]);
         $response = $this->getMockBuilder('Cake\Http\Response')->getMock();
 
@@ -898,11 +908,13 @@ class ControllerTest extends TestCase
      */
     public function testInvokeActionWithPassedParams()
     {
-        $url = new ServerRequest('test/index/1/2');
-        $url->addParams([
-            'controller' => 'Test',
-            'action' => 'index',
-            'pass' => ['param1' => '1', 'param2' => '2']
+        $url = new ServerRequest([
+            'url' => 'test/index/1/2',
+            'params' => [
+                'controller' => 'Test',
+                'action' => 'index',
+                'pass' => ['param1' => '1', 'param2' => '2']
+            ]
         ]);
         $response = $this->getMockBuilder('Cake\Http\Response')->getMock();
 
@@ -921,9 +933,9 @@ class ControllerTest extends TestCase
      */
     public function testViewPathConventions()
     {
-        $request = new ServerRequest('admin/posts');
-        $request->addParams([
-            'prefix' => 'admin'
+        $request = new ServerRequest([
+            'url' => 'admin/posts',
+            'params' => ['prefix' => 'admin']
         ]);
         $response = $this->getMockBuilder('Cake\Http\Response')->getMock();
         $Controller = new \TestApp\Controller\Admin\PostsController($request, $response);
@@ -933,9 +945,7 @@ class ControllerTest extends TestCase
         $Controller->render();
         $this->assertEquals('Admin' . DS . 'Posts', $Controller->viewBuilder()->templatePath());
 
-        $request->addParams([
-            'prefix' => 'admin/super'
-        ]);
+        $request = $request->withParam('prefix', 'admin/super');
         $response = $this->getMockBuilder('Cake\Http\Response')->getMock();
         $Controller = new \TestApp\Controller\Admin\PostsController($request, $response);
         $Controller->getEventManager()->on('Controller.beforeRender', function (Event $e) {
@@ -944,9 +954,11 @@ class ControllerTest extends TestCase
         $Controller->render();
         $this->assertEquals('Admin' . DS . 'Super' . DS . 'Posts', $Controller->viewBuilder()->templatePath());
 
-        $request = new ServerRequest('pages/home');
-        $request->addParams([
-            'prefix' => false
+        $request = new ServerRequest([
+            'url' => 'pages/home',
+            'params' => [
+                'prefix' => false
+            ]
         ]);
         $Controller = new \TestApp\Controller\PagesController($request, $response);
         $Controller->getEventManager()->on('Controller.beforeRender', function (Event $e) {

+ 39 - 31
tests/TestCase/Http/ServerRequestTest.php

@@ -214,21 +214,24 @@ class ServerRequestTest extends TestCase
     /**
      * Test addParams() method
      *
+     * @group deprecated
      * @return void
      */
     public function testAddParams()
     {
-        $request = new ServerRequest();
-        $request = $request
-            ->withParam('controller', 'posts')
-            ->withParam('action', 'view');
-        $result = $request->addParams(['plugin' => null, 'action' => 'index']);
+        $this->deprecated(function () {
+            $request = new ServerRequest();
+            $request = $request
+                ->withParam('controller', 'posts')
+                ->withParam('action', 'view');
+            $result = $request->addParams(['plugin' => null, 'action' => 'index']);
 
-        $this->assertSame($result, $request, 'Method did not return itself. %s');
+            $this->assertSame($result, $request, 'Method did not return itself. %s');
 
-        $this->assertEquals('posts', $request->getParam('controller'));
-        $this->assertEquals('index', $request->getParam('action'));
-        $this->assertEquals(null, $request->getParam('plugin'));
+            $this->assertEquals('posts', $request->getParam('controller'));
+            $this->assertEquals('index', $request->getParam('action'));
+            $this->assertEquals(null, $request->getParam('plugin'));
+        });
     }
 
     /**
@@ -2669,22 +2672,25 @@ class ServerRequestTest extends TestCase
     /**
      * Test reading params
      *
+     * @group deprecated
      * @dataProvider paramReadingDataProvider
      */
     public function testGetParam($toRead, $expected)
     {
-        $request = new ServerRequest('/');
-        $request->addParams([
-            'action' => 'index',
-            'foo' => 'bar',
-            'baz' => [
-                'a' => [
-                    'b' => 'c',
+        $request = new ServerRequest([
+            'url' => '/',
+            'params' => [
+                'action' => 'index',
+                'foo' => 'bar',
+                'baz' => [
+                    'a' => [
+                        'b' => 'c',
+                    ],
                 ],
-            ],
-            'admin' => true,
-            'truthy' => 1,
-            'zero' => '0',
+                'admin' => true,
+                'truthy' => 1,
+                'zero' => '0',
+            ]
         ]);
         $this->deprecated(function () use ($expected, $request, $toRead) {
             $this->assertSame($expected, $request->param($toRead));
@@ -3074,21 +3080,23 @@ XML;
      */
     public function testIsRequested()
     {
-        $request = new ServerRequest();
-        $request->addParams([
-            'controller' => 'posts',
-            'action' => 'index',
-            'plugin' => null,
-            'requested' => 1
+        $request = new ServerRequest([
+            'params' => [
+                'controller' => 'posts',
+                'action' => 'index',
+                'plugin' => null,
+                'requested' => 1
+            ]
         ]);
         $this->assertTrue($request->is('requested'));
         $this->assertTrue($request->isRequested());
 
-        $request = new ServerRequest();
-        $request->addParams([
-            'controller' => 'posts',
-            'action' => 'index',
-            'plugin' => null,
+        $request = new ServerRequest([
+            'params' => [
+                'controller' => 'posts',
+                'action' => 'index',
+                'plugin' => null,
+            ]
         ]);
         $this->assertFalse($request->is('requested'));
         $this->assertFalse($request->isRequested());

+ 6 - 3
tests/TestCase/Routing/Filter/ControllerFactoryFilterTest.php

@@ -37,9 +37,10 @@ class ControllerFactoryFilterTest extends TestCase
 
         $filter = new ControllerFactoryFilter();
 
-        $request = new ServerRequest();
+        $request = new ServerRequest([
+            'params' => ['prefix' => 'admin', 'controller' => 'Posts', 'action' => 'index']
+        ]);
         $response = new Response();
-        $request->addParams(['prefix' => 'admin', 'controller' => 'Posts', 'action' => 'index']);
         $event = new Event(__CLASS__, $this, compact('request', 'response'));
         $filter->beforeDispatch($event);
 
@@ -48,7 +49,9 @@ class ControllerFactoryFilterTest extends TestCase
             get_class($event->getData('controller'))
         );
 
-        $request->addParams(['prefix' => 'admin/sub', 'controller' => 'Posts', 'action' => 'index']);
+        $request = new ServerRequest([
+            'params' => ['prefix' => 'admin/sub', 'controller' => 'Posts', 'action' => 'index']
+        ]);
         $event = new Event(__CLASS__, $this, compact('request', 'response'));
         $filter->beforeDispatch($event);
 

+ 45 - 38
tests/TestCase/Routing/Filter/RoutingFilterTest.php

@@ -23,6 +23,8 @@ use Cake\TestSuite\TestCase;
 
 /**
  * Routing filter test.
+ *
+ * @group deprecated
  */
 class RoutingFilterTest extends TestCase
 {
@@ -56,18 +58,20 @@ class RoutingFilterTest extends TestCase
      */
     public function testBeforeDispatchSetsParameters()
     {
-        Router::connect('/:controller/:action/*');
-        $filter = new RoutingFilter();
-
-        $request = new ServerRequest('/testcontroller/testaction/params1/params2/params3');
-        $event = new Event(__CLASS__, $this, compact('request'));
-        $filter->beforeDispatch($event);
-
-        $this->assertSame($request->getParam('controller'), 'testcontroller');
-        $this->assertSame($request->getParam('action'), 'testaction');
-        $this->assertSame($request->getParam('pass.0'), 'params1');
-        $this->assertSame($request->getParam('pass.1'), 'params2');
-        $this->assertSame($request->getParam('pass.2'), 'params3');
+        $this->deprecated(function () {
+            Router::connect('/:controller/:action/*');
+            $filter = new RoutingFilter();
+
+            $request = new ServerRequest('/testcontroller/testaction/params1/params2/params3');
+            $event = new Event(__CLASS__, $this, compact('request'));
+            $filter->beforeDispatch($event);
+
+            $this->assertSame($request->getParam('controller'), 'testcontroller');
+            $this->assertSame($request->getParam('action'), 'testaction');
+            $this->assertSame($request->getParam('pass.0'), 'params1');
+            $this->assertSame($request->getParam('pass.1'), 'params2');
+            $this->assertSame($request->getParam('pass.2'), 'params3');
+        });
     }
 
     /**
@@ -103,31 +107,34 @@ class RoutingFilterTest extends TestCase
      */
     public function testQueryStringOnRoot()
     {
-        Router::reload();
-        Router::connect('/', ['controller' => 'pages', 'action' => 'display', 'home']);
-        Router::connect('/pages/*', ['controller' => 'pages', 'action' => 'display']);
-        Router::connect('/:controller/:action/*');
-
-        $_GET = ['coffee' => 'life', 'sleep' => 'sissies'];
-        $filter = new RoutingFilter();
-        $request = new ServerRequest('posts/home/?coffee=life&sleep=sissies');
-
-        $event = new Event(__CLASS__, $this, compact('request'));
-        $filter->beforeDispatch($event);
-
-        $this->assertRegExp('/posts/', $request->getParam('controller'));
-        $this->assertRegExp('/home/', $request->getParam('action'));
-        $this->assertSame('sissies', $request->getQuery('sleep'));
-        $this->assertSame('life', $request->getQuery('coffee'));
-
-        $request = new ServerRequest('/?coffee=life&sleep=sissy');
-        $event = new Event(__CLASS__, $this, compact('request'));
-        $filter->beforeDispatch($event);
-
-        $this->assertRegExp('/pages/', $request->getParam('controller'));
-        $this->assertRegExp('/display/', $request->getParam('action'));
-        $this->assertSame('sissy', $request->getQuery('sleep'));
-        $this->assertSame('life', $request->getQuery('coffee'));
-        $this->assertEquals('life', $request->getQuery('coffee'));
+        $this->deprecated(function () {
+            Router::reload();
+            Router::connect('/', ['controller' => 'pages', 'action' => 'display', 'home']);
+            Router::connect('/pages/*', ['controller' => 'pages', 'action' => 'display']);
+            Router::connect('/:controller/:action/*');
+
+            $_GET = ['coffee' => 'life', 'sleep' => 'sissies'];
+            $filter = new RoutingFilter();
+            $request = new ServerRequest('posts/home/?coffee=life&sleep=sissies');
+
+            $event = new Event(__CLASS__, $this, compact('request'));
+            $filter->beforeDispatch($event);
+
+            $this->assertRegExp('/posts/', $request->getParam('controller'));
+            $this->assertRegExp('/home/', $request->getParam('action'));
+            $this->assertSame('sissies', $request->getQuery('sleep'));
+            $this->assertSame('life', $request->getQuery('coffee'));
+
+            $request = new ServerRequest('/?coffee=life&sleep=sissy');
+
+            $event = new Event(__CLASS__, $this, compact('request'));
+            $filter->beforeDispatch($event);
+
+            $this->assertRegExp('/pages/', $request->getParam('controller'));
+            $this->assertRegExp('/display/', $request->getParam('action'));
+            $this->assertSame('sissy', $request->getQuery('sleep'));
+            $this->assertSame('life', $request->getQuery('coffee'));
+            $this->assertEquals('life', $request->getQuery('coffee'));
+        });
     }
 }

+ 245 - 292
tests/TestCase/Routing/RouterTest.php

@@ -104,15 +104,16 @@ class RouterTest extends TestCase
     public function testCurrentUrlWithBasePath()
     {
         Router::fullBaseUrl('http://example.com');
-        $request = new ServerRequest();
-        $request->addParams([
-            'action' => 'view',
-            'plugin' => null,
-            'controller' => 'pages',
-            'pass' => ['1']
+        $request = new ServerRequest([
+            'params' => [
+                'action' => 'view',
+                'plugin' => null,
+                'controller' => 'pages',
+                'pass' => ['1']
+            ],
+            'here' => '/cakephp',
+            'url' => '/cakephp/pages/view/1',
         ]);
-        $request->base = '/cakephp';
-        $request->here = '/cakephp/pages/view/1';
         Router::setRequestInfo($request);
         $this->assertEquals('http://example.com/cakephp/pages/view/1', Router::url(null, true));
         $this->assertEquals('/cakephp/pages/view/1', Router::url());
@@ -555,15 +556,16 @@ class RouterTest extends TestCase
     public function testUrlGenerationWithBasePath()
     {
         Router::connect('/:controller/:action/*');
-        $request = new ServerRequest();
-        $request->addParams([
-            'action' => 'index',
-            'plugin' => null,
-            'controller' => 'subscribe',
+        $request = new ServerRequest([
+            'params' => [
+                'action' => 'index',
+                'plugin' => null,
+                'controller' => 'subscribe',
+            ],
+            'here' => '/magazine/',
+            'base' => '/magazine',
+            'webroot' => '/magazine/'
         ]);
-        $request->base = '/magazine';
-        $request->here = '/magazine/';
-        $request->webroot = '/magazine/';
         Router::pushRequest($request);
 
         $result = Router::url();
@@ -696,15 +698,13 @@ class RouterTest extends TestCase
 
         Router::reload();
         Router::connect('/:controller/:action');
-        $request = new ServerRequest();
-        $request->addParams([
-            'action' => 'index',
-            'plugin' => null,
-            'controller' => 'users',
+        $request = new ServerRequest([
+            'params' => [
+                'action' => 'index',
+                'plugin' => null,
+                'controller' => 'users',
+            ]
         ]);
-        $request->base = '/';
-        $request->here = '/';
-        $request->webroot = '/';
         Router::setRequestInfo($request);
 
         $result = Router::url(['action' => 'login']);
@@ -725,15 +725,13 @@ class RouterTest extends TestCase
 
         Router::reload();
         Router::connect('/:controller', ['action' => 'index']);
-        $request = new ServerRequest();
-        $request->addParams([
-            'action' => 'index',
-            'plugin' => 'myplugin',
-            'controller' => 'mycontroller',
+        $request = new ServerRequest([
+            'params' => [
+                'action' => 'index',
+                'plugin' => 'myplugin',
+                'controller' => 'mycontroller',
+            ]
         ]);
-        $request->base = '/';
-        $request->here = '/';
-        $request->webroot = '/';
         Router::setRequestInfo($request);
 
         $result = Router::url(['plugin' => null, 'controller' => 'myothercontroller']);
@@ -897,17 +895,16 @@ class RouterTest extends TestCase
         Router::connect('/admin/:controller/:action/*', ['prefix' => 'admin']);
         Router::extensions('rss', false);
 
-        $request = new ServerRequest();
-        $request->addParams([
-            'controller' => 'registrations',
-            'action' => 'admin_index',
-            'plugin' => null,
-            'prefix' => 'admin',
-            '_ext' => 'html'
+        $request = new ServerRequest([
+            'params' => [
+                'controller' => 'registrations',
+                'action' => 'admin_index',
+                'plugin' => null,
+                'prefix' => 'admin',
+                '_ext' => 'html'
+            ],
+            'url' => '/admin/registrations/index',
         ]);
-        $request->base = '';
-        $request->here = '/admin/registrations/index';
-        $request->webroot = '/';
         Router::setRequestInfo($request);
 
         $result = Router::url([]);
@@ -918,16 +915,17 @@ class RouterTest extends TestCase
         Router::connect('/admin/subscriptions/:action/*', ['controller' => 'subscribe', 'prefix' => 'admin']);
         Router::connect('/admin/:controller/:action/*', ['prefix' => 'admin']);
 
-        $request = new ServerRequest();
-        $request->addParams([
-            'action' => 'index',
-            'plugin' => null,
-            'controller' => 'subscribe',
-            'prefix' => 'admin',
+        $request = new ServerRequest([
+            'params' => [
+                'action' => 'index',
+                'plugin' => null,
+                'controller' => 'subscribe',
+                'prefix' => 'admin',
+            ],
+            'webroot' => '/magazine/',
+            'base' => '/magazine',
+            'url' => '/magazine/admin/subscriptions/edit/1',
         ]);
-        $request->base = '/magazine';
-        $request->here = '/magazine/admin/subscriptions/edit/1';
-        $request->webroot = '/magazine/';
         Router::setRequestInfo($request);
 
         $result = Router::url(['action' => 'edit', 1]);
@@ -939,16 +937,16 @@ class RouterTest extends TestCase
         $this->assertEquals($expected, $result);
 
         Router::reload();
-        $request = new ServerRequest();
-        $request->addParams([
-            'prefix' => 'admin',
-            'action' => 'index',
-            'plugin' => null,
-            'controller' => 'users',
+        $request = new ServerRequest([
+            'params' => [
+                'prefix' => 'admin',
+                'action' => 'index',
+                'plugin' => null,
+                'controller' => 'users',
+            ],
+            'webroot' => '/',
+            'url' => '/admin/users/index',
         ]);
-        $request->base = '/';
-        $request->here = '/';
-        $request->webroot = '/';
         Router::setRequestInfo($request);
 
         Router::connect('/page/*', ['controller' => 'pages', 'action' => 'view', 'prefix' => 'admin']);
@@ -960,16 +958,16 @@ class RouterTest extends TestCase
         Router::reload();
         Router::connect('/admin/:controller/:action/*', ['prefix' => 'admin']);
 
-        $request = new ServerRequest();
-        $request->addParams([
-            'plugin' => null,
-            'controller' => 'pages',
-            'action' => 'add',
-            'prefix' => 'admin'
+        $request = new ServerRequest([
+            'params' => [
+                'plugin' => null,
+                'controller' => 'pages',
+                'action' => 'add',
+                'prefix' => 'admin'
+            ],
+            'webroot' => '/',
+            'url' => '/admin/pages/add',
         ]);
-        $request->base = '';
-        $request->here = '/admin/pages/add';
-        $request->webroot = '/';
         Router::setRequestInfo($request);
 
         $result = Router::url(['plugin' => null, 'controller' => 'pages', 'action' => 'add', 'id' => false]);
@@ -978,16 +976,16 @@ class RouterTest extends TestCase
 
         Router::reload();
         Router::connect('/admin/:controller/:action/*', ['prefix' => 'admin']);
-        $request = new ServerRequest();
-        $request->addParams([
-            'plugin' => null,
-            'controller' => 'pages',
-            'action' => 'add',
-            'prefix' => 'admin'
+        $request = new ServerRequest([
+            'params' => [
+                'plugin' => null,
+                'controller' => 'pages',
+                'action' => 'add',
+                'prefix' => 'admin'
+            ],
+            'webroot' => '/',
+            'url' => '/admin/pages/add',
         ]);
-        $request->base = '';
-        $request->here = '/admin/pages/add';
-        $request->webroot = '/';
         Router::setRequestInfo($request);
 
         $result = Router::url(['plugin' => null, 'controller' => 'pages', 'action' => 'add', 'id' => false]);
@@ -996,20 +994,17 @@ class RouterTest extends TestCase
 
         Router::reload();
         Router::connect('/admin/:controller/:action/:id', ['prefix' => 'admin'], ['id' => '[0-9]+']);
-        $request = new ServerRequest();
-        Router::setRequestInfo(
-            $request->addParams([
+        $request = new ServerRequest([
+            'params' => [
                 'plugin' => null,
                 'controller' => 'pages',
                 'action' => 'edit',
                 'pass' => ['284'],
                 'prefix' => 'admin'
-            ])->addPaths([
-                'base' => '',
-                'here' => '/admin/pages/edit/284',
-                'webroot' => '/'
-            ])
-        );
+            ],
+            'url' => '/admin/pages/edit/284',
+        ]);
+        Router::setRequestInfo($request);
 
         $result = Router::url(['plugin' => null, 'controller' => 'pages', 'action' => 'edit', 'id' => '284']);
         $expected = '/admin/pages/edit/284';
@@ -1018,14 +1013,13 @@ class RouterTest extends TestCase
         Router::reload();
         Router::connect('/admin/:controller/:action/*', ['prefix' => 'admin']);
 
-        $request = new ServerRequest();
-        Router::setRequestInfo(
-            $request->addParams([
+        $request = new ServerRequest([
+            'params' => [
                 'plugin' => null, 'controller' => 'pages', 'action' => 'add', 'prefix' => 'admin',
-            ])->addPaths([
-                'base' => '', 'here' => '/admin/pages/add', 'webroot' => '/'
-            ])
-        );
+            ],
+            'url' => '/admin/pages/add',
+        ]);
+        Router::setRequestInfo($request);
 
         $result = Router::url(['plugin' => null, 'controller' => 'pages', 'action' => 'add', 'id' => false]);
         $expected = '/admin/pages/add';
@@ -1034,15 +1028,13 @@ class RouterTest extends TestCase
         Router::reload();
         Router::connect('/admin/:controller/:action/*', ['prefix' => 'admin']);
 
-        $request = new ServerRequest();
-        Router::setRequestInfo(
-            $request->addParams([
+        $request = new ServerRequest([
+            'params' => [
                 'plugin' => null, 'controller' => 'pages', 'action' => 'edit', 'prefix' => 'admin',
-                'pass' => ['284']
-            ])->addPaths([
-                'base' => '', 'here' => '/admin/pages/edit/284', 'webroot' => '/'
-            ])
-        );
+            ],
+            'url' => '/admin/pages/edit/284',
+        ]);
+        Router::setRequestInfo($request);
 
         $result = Router::url(['plugin' => null, 'controller' => 'pages', 'action' => 'edit', 284]);
         $expected = '/admin/pages/edit/284';
@@ -1050,14 +1042,14 @@ class RouterTest extends TestCase
 
         Router::reload();
         Router::connect('/admin/posts/*', ['controller' => 'posts', 'action' => 'index', 'prefix' => 'admin']);
-        Router::setRequestInfo(
-            $request->addParams([
+        $request = new ServerRequest([
+            'params' => [
                 'plugin' => null, 'controller' => 'posts', 'action' => 'index', 'prefix' => 'admin',
                 'pass' => ['284']
-            ])->addPaths([
-                'base' => '', 'here' => '/admin/posts', 'webroot' => '/'
-            ])
-        );
+            ],
+            'url' => '/admin/pages/edit/284',
+        ]);
+        Router::setRequestInfo($request);
 
         $result = Router::url(['all']);
         $expected = '/admin/posts/all';
@@ -1163,8 +1155,9 @@ class RouterTest extends TestCase
         Router::scope('/', function ($r) {
             $r->fallbacks('InflectedRoute');
         });
-        $request = new ServerRequest();
-        $request->addParams(['controller' => 'Tasks', 'action' => 'index', '_ext' => 'rss']);
+        $request = new ServerRequest([
+            'params' => ['plugin' => null, 'controller' => 'Tasks', 'action' => 'index', '_ext' => 'rss']
+        ]);
         Router::pushRequest($request);
 
         $result = Router::url([
@@ -1277,14 +1270,13 @@ class RouterTest extends TestCase
     public function testUrlGenerationWithUrlFilter()
     {
         Router::connect('/:lang/:controller/:action/*');
-        $request = new ServerRequest();
-        $request->addParams([
-            'lang' => 'en',
-            'controller' => 'posts',
-            'action' => 'index'
-        ])->addPaths([
-            'base' => '',
-            'here' => '/'
+        $request = new ServerRequest([
+            'params' => [
+                'plugin' => null,
+                'lang' => 'en',
+                'controller' => 'posts',
+                'action' => 'index'
+            ]
         ]);
         Router::pushRequest($request);
 
@@ -1314,14 +1306,14 @@ class RouterTest extends TestCase
     public function testUrlParamPersistence()
     {
         Router::connect('/:lang/:controller/:action/*', [], ['persist' => ['lang']]);
-        $request = new ServerRequest();
-        $request->addParams([
-            'lang' => 'en',
-            'controller' => 'posts',
-            'action' => 'index'
-        ])->addPaths([
-            'base' => '',
-            'here' => '/'
+        $request = new ServerRequest([
+            'url' => '/en/posts/index',
+            'params' => [
+                'plugin' => null,
+                'lang' => 'en',
+                'controller' => 'posts',
+                'action' => 'index'
+            ]
         ]);
         Router::pushRequest($request);
 
@@ -1358,20 +1350,17 @@ class RouterTest extends TestCase
     {
         Router::connect('/admin/:controller', ['action' => 'index', 'prefix' => 'admin']);
         Router::connect('/admin/:controller/:action/*', ['prefix' => 'admin']);
-        $request = new ServerRequest();
-        Router::setRequestInfo(
-            $request->addParams([
+        $request = new ServerRequest([
+            'url' => '/admin/this/interesting/index',
+            'params' => [
                 'pass' => [],
                 'prefix' => 'admin',
                 'plugin' => 'this',
                 'action' => 'index',
                 'controller' => 'interesting',
-            ])->addPaths([
-                'base' => '',
-                'here' => '/admin/this/interesting/index',
-                'webroot' => '/',
-            ])
-        );
+            ]
+        ]);
+        Router::setRequestInfo($request);
         $result = Router::url(['plugin' => null, 'controller' => 'posts', 'action' => 'index']);
         $this->assertEquals('/admin/posts', $result);
     }
@@ -2002,17 +1991,14 @@ class RouterTest extends TestCase
         Router::connect('/admin/:controller/:action/*', ['prefix' => 'admin']);
         Router::connect('/:controller/:action/*');
 
-        $request = new ServerRequest();
-        Router::setRequestInfo(
-            $request->addParams([
+        $request = new ServerRequest([
+            'url' => '/images/index',
+            'params' => [
                 'plugin' => null, 'controller' => 'images', 'action' => 'index',
                 'prefix' => null, 'protected' => false, 'url' => ['url' => 'images/index']
-            ])->addPaths([
-                'base' => '',
-                'here' => '/images/index',
-                'webroot' => '/',
-            ])
-        );
+            ],
+        ]);
+        Router::setRequestInfo($request);
 
         $result = Router::url(['controller' => 'images', 'action' => 'add']);
         $expected = '/images/add';
@@ -2059,19 +2045,14 @@ class RouterTest extends TestCase
     public function testGenerationWithSslOption()
     {
         Router::connect('/:controller/:action/*');
-
         $request = new ServerRequest([
+            'url' => '/images/index',
+            'params' => [
+                'plugin' => null, 'controller' => 'images', 'action' => 'index'
+            ],
             'environment' => ['HTTP_HOST' => 'localhost']
         ]);
-        Router::pushRequest(
-            $request->addParams([
-                'plugin' => null, 'controller' => 'images', 'action' => 'index'
-            ])->addPaths([
-                'base' => '',
-                'here' => '/images/index',
-                'webroot' => '/',
-            ])
-        );
+        Router::pushRequest($request);
 
         $result = Router::url([
             '_ssl' => true
@@ -2092,21 +2073,16 @@ class RouterTest extends TestCase
     public function testGenerateWithSslInSsl()
     {
         Router::connect('/:controller/:action/*');
-
         $request = new ServerRequest([
-            'environment' => ['HTTP_HOST' => 'localhost', 'HTTPS' => 'on']
-        ]);
-        Router::pushRequest(
-            $request->addParams([
+            'url' => '/images/index',
+            'environment' => ['HTTP_HOST' => 'localhost', 'HTTPS' => 'on'],
+            'params' => [
                 'plugin' => null,
                 'controller' => 'images',
                 'action' => 'index'
-            ])->addPaths([
-                'base' => '',
-                'here' => '/images/index',
-                'webroot' => '/',
-            ])
-        );
+            ]
+        ]);
+        Router::pushRequest($request);
 
         $result = Router::url([
             '_ssl' => false
@@ -2130,19 +2106,16 @@ class RouterTest extends TestCase
         Router::connect('/protected/:controller/:action', ['prefix' => 'protected']);
         Router::connect('/:controller/:action');
 
-        $request = new ServerRequest();
-        Router::setRequestInfo(
-            $request->addParams([
+        $request = new ServerRequest([
+            'url' => '/protected/images/index',
+            'params' => [
                 'plugin' => null,
                 'controller' => 'images',
                 'action' => 'index',
                 'prefix' => 'protected',
-            ])->addPaths([
-                'base' => '',
-                'here' => '/protected/images/index',
-                'webroot' => '/',
-            ])
-        );
+            ]
+        ]);
+        Router::setRequestInfo($request);
 
         $result = Router::url(['prefix' => 'protected', 'controller' => 'images', 'action' => 'add']);
         $expected = '/protected/images/add';
@@ -2167,34 +2140,25 @@ class RouterTest extends TestCase
         Router::connect('/admin/:controller/:action', ['prefix' => 'admin']);
         Router::connect('/protected/:controller/:action', ['prefix' => 'protected']);
 
-        $request = new ServerRequest();
-        Router::setRequestInfo(
-            $request->addParams([
+        $request = new ServerRequest([
+            'url' => '/protected/images/index',
+            'params' => [
                 'plugin' => null, 'controller' => 'images', 'action' => 'index', 'prefix' => 'protected',
-            ])->addPaths([
-                'base' => '',
-                'here' => '/protected/images/index',
-                'webroot' => '/',
-            ])
-        );
+            ],
+        ]);
+        Router::setRequestInfo($request);
 
         $result = Router::url(['controller' => 'images', 'action' => 'add', 'prefix' => 'admin']);
         $expected = '/admin/images/add';
         $this->assertEquals($expected, $result);
 
-        $request = new ServerRequest();
-        Router::setRequestInfo(
-            $request->addParams([
-                'plugin' => null,
-                'controller' => 'images',
-                'action' => 'index',
-                'prefix' => 'admin',
-            ])->addPaths([
-                'base' => '',
-                'here' => '/admin/images/index',
-                'webroot' => '/',
-            ])
-        );
+        $request = new ServerRequest([
+            'url' => '/admin/images/index',
+            'params' => [
+                'plugin' => null, 'controller' => 'images', 'action' => 'index', 'prefix' => 'admin',
+            ],
+        ]);
+        Router::setRequestInfo($request);
         $result = Router::url(['controller' => 'images', 'action' => 'add', 'prefix' => 'protected']);
         $expected = '/protected/images/add';
         $this->assertEquals($expected, $result);
@@ -2236,17 +2200,14 @@ class RouterTest extends TestCase
     public function testRemoveBase()
     {
         Router::connect('/:controller/:action');
-
-        $request = new ServerRequest();
-        Router::setRequestInfo(
-            $request->addParams([
+        $request = new ServerRequest([
+            'url' => '/',
+            'base' => '/base',
+            'params' => [
                 'plugin' => null, 'controller' => 'controller', 'action' => 'index',
-            ])->addPaths([
-                'base' => '/base',
-                'here' => '/',
-                'webroot' => '/base/',
-            ])
-        );
+            ]
+        ]);
+        Router::setRequestInfo($request);
 
         $result = Router::url(['controller' => 'my_controller', 'action' => 'my_action']);
         $expected = '/base/my_controller/my_action';
@@ -2408,16 +2369,12 @@ class RouterTest extends TestCase
         Router::connect('/admin/:controller', $adminParams);
         Router::connect('/admin/:controller/:action/*', $adminParams);
 
-        $request = new ServerRequest();
-        Router::setRequestInfo(
-            $request->addParams([
-                'plugin' => null, 'controller' => 'controller', 'action' => 'index'
-            ])->addPaths([
-                'base' => '/base',
-                'here' => '/',
-                'webroot' => '/base/',
-            ])
-        );
+        $request = new ServerRequest([
+            'url' => '/',
+            'base' => '/base',
+            'params' => ['plugin' => null, 'controller' => 'controller', 'action' => 'index']
+        ]);
+        Router::setRequestInfo($request);
 
         $result = Router::parseRequest($this->makeRequest('/admin/posts/', 'GET'));
         $expected = [
@@ -2444,16 +2401,12 @@ class RouterTest extends TestCase
         Router::connect('/members/:controller/:action', $prefixParams);
         Router::connect('/members/:controller/:action/*', $prefixParams);
 
-        $request = new ServerRequest();
-        Router::setRequestInfo(
-            $request->addParams([
-                'plugin' => null, 'controller' => 'controller', 'action' => 'index',
-            ])->addPaths([
-                'base' => '/base',
-                'here' => '/',
-                'webroot' => '/',
-            ])
-        );
+        $request = new ServerRequest([
+            'url' => '/',
+            'base' => '/base',
+            'params' => ['plugin' => null, 'controller' => 'controller', 'action' => 'index']
+        ]);
+        Router::setRequestInfo($request);
 
         $result = Router::parseRequest($this->makeRequest('/members/posts/index', 'GET'));
         $expected = [
@@ -2485,19 +2438,16 @@ class RouterTest extends TestCase
         $expected = '/company/users/login';
         $this->assertEquals($expected, $result);
 
-        $request = new ServerRequest();
-        Router::setRequestInfo(
-            $request->addParams([
+        $request = new ServerRequest([
+            'url' => '/',
+            'params' => [
                 'plugin' => null,
                 'controller' => 'users',
                 'action' => 'login',
                 'prefix' => 'company'
-            ])->addPaths([
-                'base' => '/',
-                'here' => '/',
-                'webroot' => '/base/',
-            ])
-        );
+            ]
+        ]);
+        Router::setRequestInfo($request);
 
         $result = Router::url(['controller' => 'users', 'action' => 'login', 'prefix' => false]);
         $expected = '/login';
@@ -2515,17 +2465,17 @@ class RouterTest extends TestCase
             '/admin/login',
             ['controller' => 'users', 'action' => 'login', 'prefix' => 'admin']
         );
-        $request = new ServerRequest();
-        Router::setRequestInfo(
-            $request->addParams([
-                'plugin' => null, 'controller' => 'posts', 'action' => 'index',
+        $request = new ServerRequest([
+            'url' => '/',
+            'params' => [
+                'plugin' => null,
+                'controller' => 'posts',
+                'action' => 'index',
                 'prefix' => 'admin'
-            ])->addPaths([
-                'base' => '/',
-                'here' => '/',
-                'webroot' => '/',
-            ])
-        );
+            ],
+            'webroot' => '/'
+        ]);
+        Router::setRequestInfo($request);
         $result = Router::url(['controller' => 'users', 'action' => 'login']);
         $this->assertEquals('/admin/login', $result);
 
@@ -2603,19 +2553,16 @@ class RouterTest extends TestCase
         $this->expectException(\Cake\Routing\Exception\MissingRouteException::class);
         Router::connect('/:locale/:controller/:action/*', [], ['locale' => 'dan|eng']);
 
-        $request = new ServerRequest();
-        Router::setRequestInfo(
-            $request->addParams([
+        $request = new ServerRequest([
+            'url' => '/test/test_action',
+            'params' => [
                 'plugin' => null,
                 'controller' => 'test',
                 'action' => 'index',
-                'url' => ['url' => 'test/test_action']
-            ])->addPaths([
-                'base' => '',
-                'here' => '/test/test_action',
-                'webroot' => '/',
-            ])
-        );
+            ],
+            'webroot' => '/'
+        ]);
+        Router::setRequestInfo($request);
 
         $result = Router::url(['action' => 'test_another_action', 'locale' => 'eng']);
         $expected = '/eng/test/test_another_action';
@@ -2748,14 +2695,16 @@ class RouterTest extends TestCase
     public function testReverseCakeRequestQuery()
     {
         Router::connect('/:lang/:controller/:action/*', [], ['lang' => '[a-z]{3}']);
-        $request = new ServerRequest('/eng/posts/view/1');
-        $request->addParams([
-            'lang' => 'eng',
-            'controller' => 'posts',
-            'action' => 'view',
-            'pass' => [1],
+        $request = new ServerRequest([
+            'url' => '/eng/posts/view/1',
+            'params' => [
+                'lang' => 'eng',
+                'controller' => 'posts',
+                'action' => 'view',
+                'pass' => [1],
+            ],
+            'query' => ['url' => 'eng/posts/view/1', 'test' => 'value']
         ]);
-        $request->query = ['url' => 'eng/posts/view/1', 'test' => 'value'];
         $result = Router::reverse($request);
         $expected = '/eng/posts/view/1?test=value';
         $this->assertEquals($expected, $result);
@@ -2784,14 +2733,15 @@ class RouterTest extends TestCase
         Router::connect('/:controller/:action/*');
         Router::extensions('json', false);
 
-        $request = new ServerRequest('/posts/view/1.json');
-        $request->addParams([
-            'controller' => 'posts',
-            'action' => 'view',
-            'pass' => [1],
-            '_ext' => 'json',
+        $request = new ServerRequest([
+            'url' => '/posts/view/1.json',
+            'params' => [
+                'controller' => 'posts',
+                'action' => 'view',
+                'pass' => [1],
+                '_ext' => 'json',
+            ]
         ]);
-        $request->query = [];
         $result = Router::reverse($request);
         $expected = '/posts/view/1.json';
         $this->assertEquals($expected, $result);
@@ -2823,22 +2773,22 @@ class RouterTest extends TestCase
     public function testReverseToArrayRequestQuery()
     {
         Router::connect('/:lang/:controller/:action/*', [], ['lang' => '[a-z]{3}']);
-        $request = new ServerRequest('/eng/posts/view/1');
-        $request->addParams([
-            'lang' => 'eng',
-            'controller' => 'posts',
-            'action' => 'view',
-            'pass' => [123],
+        $request = new ServerRequest([
+            'url' => '/eng/posts/view/1',
+            'params' => [
+                'lang' => 'eng',
+                'controller' => 'posts',
+                'action' => 'view',
+                'pass' => [123],
+            ],
+            'query' => ['url' => 'eng/posts/view/1', 'test' => 'value']
         ]);
-        $request->query = ['url' => 'eng/posts/view/1', 'test' => 'value'];
         $actual = Router::reverseToArray($request);
         $expected = [
             'lang' => 'eng',
-            'plugin' => null,
             'controller' => 'posts',
             'action' => 'view',
             123,
-            '_ext' => null,
             '?' => [
                 'test' => 'value',
             ],
@@ -2906,21 +2856,24 @@ class RouterTest extends TestCase
         Router::connect('/:controller', ['action' => 'index']);
         Router::connect('/:controller/:action');
 
-        $firstRequest = new ServerRequest('/posts/index');
-        $firstRequest->addParams([
-            'plugin' => null,
-            'controller' => 'posts',
-            'action' => 'index'
-        ])->addPaths(['base' => '']);
-
-        $secondRequest = new ServerRequest('/posts/index');
-        $secondRequest->addParams([
-            'requested' => 1,
-            'plugin' => null,
-            'controller' => 'comments',
-            'action' => 'listing'
-        ])->addPaths(['base' => '']);
+        $firstRequest = new ServerRequest([
+            'url' => '/posts/index',
+            'params' => [
+                'plugin' => null,
+                'controller' => 'posts',
+                'action' => 'index'
+            ]
+        ]);
 
+        $secondRequest = new ServerRequest([
+            'url' => '/posts/index',
+            'params' => [
+                'requested' => 1,
+                'plugin' => null,
+                'controller' => 'comments',
+                'action' => 'listing'
+            ]
+        ]);
         Router::setRequestInfo($firstRequest);
         Router::setRequestInfo($secondRequest);
 

+ 15 - 13
tests/TestCase/View/Helper/PaginatorHelperTest.php

@@ -54,19 +54,21 @@ class PaginatorHelperTest extends TestCase
         Configure::write('Config.language', 'eng');
         $this->View = new View();
         $this->Paginator = new PaginatorHelper($this->View);
-        $this->Paginator->request = new ServerRequest();
-        $this->Paginator->request->addParams([
-            'paging' => [
-                'Article' => [
-                    'page' => 1,
-                    'current' => 9,
-                    'count' => 62,
-                    'prevPage' => false,
-                    'nextPage' => true,
-                    'pageCount' => 7,
-                    'sort' => null,
-                    'direction' => null,
-                    'limit' => null,
+        $this->Paginator->request = new ServerRequest([
+            'url' => '/',
+            'params' => [
+                'paging' => [
+                    'Article' => [
+                        'page' => 1,
+                        'current' => 9,
+                        'count' => 62,
+                        'prevPage' => false,
+                        'nextPage' => true,
+                        'pageCount' => 7,
+                        'sort' => null,
+                        'direction' => null,
+                        'limit' => null,
+                    ]
                 ]
             ]
         ]);