From c4a7368d043f26ad1ca510b13c112fa2ccdba74f Mon Sep 17 00:00:00 2001 From: Remi Collet Date: Wed, 29 Jun 2016 13:07:06 +0200 Subject: php-zendframework-zend-mvc-plugin-prg: 1.0.0 (New Package) --- .../src/PostRedirectGet.php | 150 +++++++++++++++++++++ 1 file changed, 150 insertions(+) create mode 100644 zend-mvc-plugin-prg-8c7ccb9f0004e92ff258b483447d914f42cb7448/src/PostRedirectGet.php (limited to 'zend-mvc-plugin-prg-8c7ccb9f0004e92ff258b483447d914f42cb7448/src/PostRedirectGet.php') diff --git a/zend-mvc-plugin-prg-8c7ccb9f0004e92ff258b483447d914f42cb7448/src/PostRedirectGet.php b/zend-mvc-plugin-prg-8c7ccb9f0004e92ff258b483447d914f42cb7448/src/PostRedirectGet.php new file mode 100644 index 0000000..9a6279b --- /dev/null +++ b/zend-mvc-plugin-prg-8c7ccb9f0004e92ff258b483447d914f42cb7448/src/PostRedirectGet.php @@ -0,0 +1,150 @@ +getController(); + $request = $controller->getRequest(); + $container = $this->getSessionContainer(); + + if ($request->isPost()) { + $container->setExpirationHops(1, 'post'); + $container->post = $request->getPost()->toArray(); + return $this->redirect($redirect, $redirectToUrl); + } + + if (null !== $container->post) { + $post = $container->post; + unset($container->post); + return $post; + } + + return false; + } + + /** + * @return Container + */ + public function getSessionContainer() + { + if (! $this->sessionContainer) { + $this->sessionContainer = new Container('prg_post1'); + } + return $this->sessionContainer; + } + + /** + * @param Container $container + * @return PostRedirectGet + */ + public function setSessionContainer(Container $container) + { + $this->sessionContainer = $container; + return $this; + } + + /** + * TODO: Good candidate for traits method in PHP 5.4 with FilePostRedirectGet plugin + * + * @param string $redirect + * @param bool $redirectToUrl + * @return \Zend\Http\Response + * @throws RuntimeException if route-based redirection is requested, but no + * plugin manager is composed in the controller. + */ + protected function redirect($redirect, $redirectToUrl) + { + $controller = $this->getController(); + $params = []; + $options = ['query' => $controller->params()->fromQuery()]; + $reuseMatchedParams = false; + + if (null === $redirect) { + $routeMatch = $controller->getEvent()->getRouteMatch(); + + $redirect = $routeMatch->getMatchedRouteName(); + // null indicates to redirect to self. + $reuseMatchedParams = true; + } + + $redirector = $this->marshalRedirectPlugin($controller, $redirectToUrl); + + // Redirect to route-based URL + if (false === $redirectToUrl) { + $response = $redirector->toRoute($redirect, $params, $options, $reuseMatchedParams); + $response->setStatusCode(303); + return $response; + } + + // Redirect to specific URL + $response = $redirector->toUrl($redirect); + $response->setStatusCode(303); + + return $response; + } + + /** + * Marshal a redirect plugin instance. + * + * @param DispatchableInterface $controller + * @param bool $redirectToUrl + * @return Redirect + * @throws RuntimeException if route-based redirection is requested, but no + * plugin manager is composed in the controller. + */ + private function marshalRedirectPlugin(DispatchableInterface $controller, $redirectToUrl) + { + if (method_exists($controller, 'getPluginManager')) { + // get the redirect plugin from the plugin manager + return $controller->getPluginManager()->get('Redirect'); + } + + // If the user wants to redirect to a route, the redirector has to come + // from the plugin manager; otherwise no router will be injected + if (false === $redirectToUrl) { + throw new RuntimeException('Could not redirect to a route without a router'); + } + + return new Redirect(); + } +} -- cgit