/** * @test */ public function dispatchContinuesWithNextRequestFoundInAForwardException() { /** @var ActionRequest|\PHPUnit_Framework_MockObject_MockObject $nextRequest */ $nextRequest = $this->getMockBuilder(ActionRequest::class)->disableOriginalConstructor()->getMock(); $nextRequest->expects($this->atLeastOnce())->method('isDispatched')->will($this->returnValue(true)); $this->mockParentRequest->expects($this->atLeastOnce())->method('isDispatched')->will($this->returnValue(false)); $this->mockController->expects($this->at(0))->method('processRequest')->with($this->mockActionRequest)->will($this->throwException(new StopActionException())); $forwardException = new ForwardException(); $forwardException->setNextRequest($nextRequest); $this->mockController->expects($this->at(1))->method('processRequest')->with($this->mockParentRequest)->will($this->throwException($forwardException)); $this->dispatcher->dispatch($this->mockActionRequest, $this->mockHttpResponse); }
/** * Forwards the request to another action and / or controller. * * Request is directly transferred to the other action / controller * * @param string $actionName Name of the action to forward to * @param string $controllerName Unqualified object name of the controller to forward to. If not specified, the current controller is used. * @param string $packageKey Key of the package containing the controller to forward to. May also contain the sub package, concatenated with backslash (Vendor.Foo\Bar\Baz). If not specified, the current package is assumed. * @param array $arguments Arguments to pass to the target action * @return void * @throws ForwardException * @see redirect() * @api */ protected function forward($actionName, $controllerName = null, $packageKey = null, array $arguments = []) { $nextRequest = clone $this->request; $nextRequest->setControllerActionName($actionName); if ($controllerName !== null) { $nextRequest->setControllerName($controllerName); } if ($packageKey !== null && strpos($packageKey, '\\') !== false) { list($packageKey, $subpackageKey) = explode('\\', $packageKey, 2); } else { $subpackageKey = null; } if ($packageKey !== null) { $nextRequest->setControllerPackageKey($packageKey); $nextRequest->setControllerSubpackageKey($subpackageKey); } $regularArguments = []; foreach ($arguments as $argumentName => $argumentValue) { if (substr($argumentName, 0, 2) === '__') { $nextRequest->setArgument($argumentName, $argumentValue); } else { $regularArguments[$argumentName] = $argumentValue; } } $nextRequest->setArguments($this->persistenceManager->convertObjectsToIdentityArrays($regularArguments)); $this->arguments->removeAll(); $forwardException = new ForwardException(); $forwardException->setNextRequest($nextRequest); throw $forwardException; }