diff --git a/src/Routing/Dispatcher.php b/src/Routing/Dispatcher.php index 2cd6ab99a67..bc19c6e30bc 100644 --- a/src/Routing/Dispatcher.php +++ b/src/Routing/Dispatcher.php @@ -94,8 +94,8 @@ public function getEventManager() { * @return string|void if `$request['return']` is set then it returns response body, null otherwise * @throws \Cake\Controller\Error\MissingControllerException When the controller is missing. */ - public function dispatch(Request $request, Response $response, array $additionalParams = array()) { - $beforeEvent = new Event('Dispatcher.beforeDispatch', $this, compact('request', 'response', 'additionalParams')); + public function dispatch(Request $request, Response $response) { + $beforeEvent = new Event('Dispatcher.beforeDispatch', $this, compact('request', 'response')); $this->getEventManager()->dispatch($beforeEvent); $request = $beforeEvent->data['request']; diff --git a/src/Routing/RequestActionTrait.php b/src/Routing/RequestActionTrait.php index af786afd35d..77a679c6e22 100644 --- a/src/Routing/RequestActionTrait.php +++ b/src/Routing/RequestActionTrait.php @@ -16,7 +16,7 @@ use Cake\Core\Configure; use Cake\Network\Request; use Cake\Network\Response; -use Cake\Routing\Dispatcher; +use Cake\Routing\DispatcherFactory; use Cake\Routing\Router; /** @@ -95,19 +95,23 @@ public function requestAction($url, array $extra = array()) { } unset($extra['post'], $extra['query']); - if (is_string($url) && strpos($url, Configure::read('App.fullBaseUrl')) === 0) { - $url = Router::normalize(str_replace(Configure::read('App.fullBaseUrl'), '', $url)); + $baseUrl = Configure::read('App.fullBaseUrl'); + if (is_string($url) && strpos($url, $baseUrl) === 0) { + $url = Router::normalize(str_replace($baseUrl, '', $url)); } if (is_string($url)) { $params = [ 'url' => $url ]; } elseif (is_array($url)) { - $params = array_merge($url, [ - 'pass' => [], + $params = [ + 'params' => $url, 'base' => false, 'url' => Router::reverse($url) - ]); + ]; + if (empty($params['params']['pass'])) { + $params['params']['pass'] = []; + } } if (!empty($post)) { $params['post'] = $post; @@ -116,8 +120,9 @@ public function requestAction($url, array $extra = array()) { $params['query'] = $query; } $request = new Request($params); - $dispatcher = new Dispatcher(); - $result = $dispatcher->dispatch($request, new Response(), $extra); + $request->addParams($extra); + $dispatcher = DispatcherFactory::create(); + $result = $dispatcher->dispatch($request, new Response()); Router::popRequest(); return $result; } diff --git a/tests/TestCase/Routing/RequestActionTraitTest.php b/tests/TestCase/Routing/RequestActionTraitTest.php index 7c8b7008703..2f337e3359e 100644 --- a/tests/TestCase/Routing/RequestActionTraitTest.php +++ b/tests/TestCase/Routing/RequestActionTraitTest.php @@ -16,6 +16,7 @@ use Cake\Core\App; use Cake\Core\Configure; use Cake\Core\Plugin; +use Cake\Routing\DispatcherFactory; use Cake\Routing\RequestActionTrait; use Cake\Routing\Router; use Cake\TestSuite\TestCase; @@ -40,9 +41,20 @@ public function setUp() { parent::setUp(); Configure::write('App.namespace', 'TestApp'); Configure::write('Security.salt', 'not-the-default'); + DispatcherFactory::add('RoutingFilter'); $this->object = $this->getObjectForTrait('Cake\Routing\RequestActionTrait'); } +/** + * teardown + * + * @return void + */ + public function tearDown() { + parent::tearDown(); + DispatcherFactory::clear(); + } + /** * testRequestAction method *