/** * Creates an URI used for linking to an Controller action. * * @param string $actionName Name of the action to be called * @param array $controllerArguments Additional query parameters. Will be merged with $this->arguments. * @param string $controllerName Name of the target controller. If not set, current ControllerName is used. * @param string $packageKey Name of the target package. If not set, current Package is used. * @param string $subPackageKey Name of the target SubPackage. If not set, current SubPackage is used. * @return string the rendered URI * @api * @see build() * @throws \TYPO3\Flow\Mvc\Routing\Exception\MissingActionNameException if $actionName parameter is empty */ public function uriFor($actionName, $controllerArguments = array(), $controllerName = null, $packageKey = null, $subPackageKey = null) { if ($actionName === null || $actionName === '') { throw new \TYPO3\Flow\Mvc\Routing\Exception\MissingActionNameException('The URI Builder could not build a URI linking to an action controller because no action name was specified. Please check the stack trace to see which code or template was requesting the link and check the arguments passed to the URI Builder.', 1354629891); } $controllerArguments['@action'] = strtolower($actionName); if ($controllerName !== null) { $controllerArguments['@controller'] = strtolower($controllerName); } else { $controllerArguments['@controller'] = strtolower($this->request->getControllerName()); } if ($packageKey === null && $subPackageKey === null) { $subPackageKey = $this->request->getControllerSubpackageKey(); } if ($packageKey === null) { $packageKey = $this->request->getControllerPackageKey(); } $controllerArguments['@package'] = strtolower($packageKey); if ($subPackageKey !== null) { $controllerArguments['@subpackage'] = strtolower($subPackageKey); } if ($this->format !== null && $this->format !== '') { $controllerArguments['@format'] = $this->format; } $controllerArguments = $this->addNamespaceToArguments($controllerArguments, $this->request); return $this->build($controllerArguments); }
/** * @test */ public function setControllerPackageKeyWithLowercasePackageKeyResolvesCorrectly() { $mockPackageManager = $this->getMock(\TYPO3\Flow\Package\PackageManager::class); $mockPackageManager->expects($this->any())->method('getCaseSensitivePackageKey')->with('acme.testpackage')->will($this->returnValue('Acme.Testpackage')); $this->inject($this->actionRequest, 'packageManager', $mockPackageManager); $this->actionRequest->setControllerPackageKey('acme.testpackage'); $this->assertEquals('Acme.Testpackage', $this->actionRequest->getControllerPackageKey()); }
/** * Redirects the request to another action and / or controller. * * Redirect will be sent to the client which then performs another request to the new URI. * * NOTE: This method only supports web requests and will throw an exception * if used with other request types. * * @param ActionRequest $request The request to redirect to * @param integer $delay (optional) The delay in seconds. Default is no delay. * @param integer $statusCode (optional) The HTTP status code for the redirect. Default is "303 See Other" * @return void * @throws \TYPO3\Flow\Mvc\Exception\StopActionException * @see forwardToRequest() * @api */ protected function redirectToRequest(ActionRequest $request, $delay = 0, $statusCode = 303) { $packageKey = $request->getControllerPackageKey(); $subpackageKey = $request->getControllerSubpackageKey(); if ($subpackageKey !== null) { $packageKey .= '\\' . $subpackageKey; } $this->redirect($request->getControllerActionName(), $request->getControllerName(), $packageKey, $request->getArguments(), $delay, $statusCode, $request->getFormat()); }
/** * Is called if authentication was successful. * * @param \TYPO3\Flow\Mvc\ActionRequest $originalRequest The request that was intercepted by the security framework, NULL if there was none * @return string */ public function onAuthenticationSuccess(\TYPO3\Flow\Mvc\ActionRequest $originalRequest = NULL) { $uriBuilder = $this->controllerContext->getUriBuilder(); if ($originalRequest !== NULL) { $uri = $uriBuilder->uriFor($originalRequest->getControllerActionName(), $originalRequest->getArguments(), $originalRequest->getControllerName(), $originalRequest->getControllerPackageKey()); } else { if (isset($this->settings['Redirect']['signedIn'])) { $packageKey = $this->settings['Redirect']['signedIn']['packageKey']; $controllerName = $this->settings['Redirect']['signedIn']['controllerName']; $actionName = $this->settings['Redirect']['signedIn']['actionName']; $uri = $uriBuilder->uriFor($actionName, NULL, $controllerName, $packageKey); } else { $uri = $uriBuilder->uriFor('signIn', NULL, 'Login', 'Flow.Login'); } } $response = array(); $response['status'] = 'OK'; $response['redirect'] = $uri; $this->view->assign('value', $response); }