protected function mergeArgumentsWithRequestArguments(array $arguments)
{
if ($this->request !== $this->request->getMainRequest()) {
$subRequest = $this->request;
while ($subRequest instanceof ActionRequest) {
$requestArguments = (array) $subRequest->getArguments();
// Reset arguments for the request that is bound to this UriBuilder instance
if ($subRequest === $this->request) {
if ($this->addQueryString === false) {
$requestArguments = [];
} else {
foreach ($this->argumentsToBeExcludedFromQueryString as $argumentToBeExcluded) {
unset($requestArguments[$argumentToBeExcluded]);
}
}
} else {
// Remove all arguments of the current sub request if it's namespaced
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
$requestPackageKey = $subRequest->getControllerPackageKey();
if (!empty($requestPackageKey)) {
$requestArguments['@package'] = $requestPackageKey;
}
$requestSubpackageKey = $subRequest->getControllerSubpackageKey();
if (!empty($requestSubpackageKey)) {
$requestArguments['@subpackage'] = $requestSubpackageKey;
}
$requestControllerName = $subRequest->getControllerName();
if (!empty($requestControllerName)) {
$requestArguments['@controller'] = $requestControllerName;
}
$requestActionName = $subRequest->getControllerActionName();
if (!empty($requestActionName)) {
$requestArguments['@action'] = $requestActionName;
}
if (count($requestArguments) > 0) {
$requestArguments = $this->addNamespaceToArguments($requestArguments, $subRequest);
$arguments = Arrays::arrayMergeRecursiveOverrule($requestArguments, $arguments);
}
$subRequest = $subRequest->getParentRequest();
}
} elseif ($this->addQueryString === true) {
$requestArguments = $this->request->getArguments();
foreach ($this->argumentsToBeExcludedFromQueryString as $argumentToBeExcluded) {
unset($requestArguments[$argumentToBeExcluded]);
}
if ($requestArguments !== []) {
$arguments = Arrays::arrayMergeRecursiveOverrule($requestArguments, $arguments);
}
}
return $arguments;
}