/** * @test */ public function getMainRequestReturnsTheTopLevelActionRequestWhoseParentIsTheHttpRequest() { $httpRequest = HttpRequest::create(new Uri('http://robertlemke.com/blog')); $actionRequest = new ActionRequest($httpRequest); $anotherActionRequest = new ActionRequest($actionRequest); $yetAnotherActionRequest = new ActionRequest($anotherActionRequest); $this->assertSame($actionRequest, $actionRequest->getMainRequest()); $this->assertSame($actionRequest, $yetAnotherActionRequest->getMainRequest()); $this->assertSame($actionRequest, $anotherActionRequest->getMainRequest()); }
/** * Merges specified arguments with arguments from request. * * If $this->request is no sub request, request arguments will only be merged if $this->addQueryString is set. * Otherwise all request arguments except for the ones prefixed with the current request argument namespace will * be merged. Additionally special arguments (PackageKey, SubpackageKey, ControllerName & Action) are merged. * * The argument provided through the $arguments parameter always overrule the request * arguments. * * The request hierarchy is structured as follows: * root (HTTP) > main (Action) > sub (Action) > sub sub (Action) * * @param array $arguments * @return void */ protected function mergeArgumentsWithRequestArguments(array &$arguments) { $requestArguments = array(); $mainRequest = $this->request->getMainRequest(); $isSubRequest = $this->request !== $mainRequest; if ($isSubRequest) { $requestArguments = $mainRequest->getArguments(); // remove all arguments of the current sub request if ($this->request->getArgumentNamespace() !== '') { $requestNamespace = $this->getRequestNamespacePath($this->request); if ($this->addQueryString === FALSE) { $requestArguments = Arrays::unsetValueByPath($requestArguments, $requestNamespace); } else { foreach ($this->argumentsToBeExcludedFromQueryString as $argumentToBeExcluded) { $requestArguments = Arrays::unsetValueByPath($requestArguments, $requestNamespace . '.' . $argumentToBeExcluded); } } } // merge special arguments (package, subpackage, controller & action) from main request $mainRequestPackageKey = $mainRequest->getControllerPackageKey(); if (!empty($mainRequestPackageKey)) { $requestArguments['@package'] = $mainRequestPackageKey; } $mainRequestSubpackageKey = $mainRequest->getControllerSubpackageKey(); if (!empty($mainRequestSubpackageKey)) { $requestArguments['@subpackage'] = $mainRequestSubpackageKey; } $mainRequestControllerName = $mainRequest->getControllerName(); if (!empty($mainRequestControllerName)) { $requestArguments['@controller'] = $mainRequestControllerName; } $mainRequestActionName = $mainRequest->getControllerActionName(); if (!empty($mainRequestActionName)) { $requestArguments['@action'] = $mainRequestActionName; } } elseif ($this->addQueryString === TRUE) { $requestArguments = $this->request->getArguments(); foreach ($this->argumentsToBeExcludedFromQueryString as $argumentToBeExcluded) { unset($requestArguments[$argumentToBeExcluded]); } } if (count($requestArguments) === 0) { return; } $arguments = Arrays::arrayMergeRecursiveOverrule($requestArguments, $arguments); }