ZF2重定向POST

Ign*_*ual 2 zend-framework2

在用户尝试未经授权的操作之前我保存:

1)控制器名称

2)行动

3)POST params

然后,当用户成功登录时,我将其重定向到...

$params["controller"] = "manage";
$params["action"] = $lastRequest["action"];
$params["name"] = "Ignacio";
$params["email"] = "ignacio@gmail.com";

return $this->redirect()->toRoute("user-create", $params);
Run Code Online (Sandbox Code Playgroud)

它确实重定向,但没有发布params.

如何从控制器模拟ZF2上的POST请求?关键是我不知道用户将被重定向到哪里,因此可能是GET或POST以及任何控制器.

Ign*_*ual 5

这是我保存请求并稍后使用它重定向到正确操作的方式.

1)未经授权的操作使用所有GET/POST参数保存请求.

$session = new Container('base');
$session->offsetSet("lastRequest", $event->getRequest());
Run Code Online (Sandbox Code Playgroud)

2)成功登录后,重定向到请求

$session = new Container('base');
if($lastRequest = $session->offsetGet("lastRequest")) {
    //Just redirect, because I could NOT find a way to POST params
    return $this->redirect()->toUrl($lastRequest->getRequestUri());
}
Run Code Online (Sandbox Code Playgroud)

3)在控制器操作之前,检索所有POST/GET参数

class Module {
//...
    public function init($moduleManager)
    {
        $sharedEvents = $moduleManager->getEventManager()->getSharedManager();
        $sharedEvents->attach(__NAMESPACE__, \Zend\Mvc\MvcEvent::EVENT_DISPATCH, array($this, 'preDispatch'), 100);
    }

    public function preDispatch($event)
    {

    //Unauthorized request after success login
    $session = new Container('base');
    if($lastRequest = $session->offsetGet("lastRequest")) {
        $event->getTarget()->getRequest()->setMethod($lastRequest->getMethod());
        $event->getTarget()->getRequest()->setPost($lastRequest->getPost());
        $event->getTarget()->getRequest()->setQuery($lastRequest->getQuery());

        //Delete request
        $session->offsetSet("lastRequest", null);               
    }
}
Run Code Online (Sandbox Code Playgroud)

4)正常使用任何目标操作的请求

class ManageController extends AbstractActionController {

    public function createAction() {
        if ($this->getRequest()->isPost()) {
            $post = $this->getRequest()->getPost()->toArray();
    }

}
Run Code Online (Sandbox Code Playgroud)