【问题标题】:ZF2 redirect with POSTZF2 使用 POST 重定向
【发布时间】:2012-12-13 20:03:41
【问题描述】:

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

1) 控制器名称

2) 行动

3) POST 参数

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

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

return $this->redirect()->toRoute("user-create", $params);

它确实重定向,但没有发布参数。

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

【问题讨论】:

  • 我不确定我是否正确理解了您的问题,所以请告诉我:$params 用于user-create 路线,它将采用这条路线需要的任何东西并丢弃重置,我猜你必须使用 Zend\Http\Client 向你需要的任何 url 发出 post 请求
  • 使用 Zend\Http\Client 我从服务器发出请求。我想要的是使用他所做的 POST 参数将浏览器客户端重定向到 URL。
  • 那个插件不发布参数,只是重定向。

标签: zend-framework2


【解决方案1】:

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

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

$session = new Container('base');
$session->offsetSet("lastRequest", $event->getRequest());

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());
}

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);               
    }
}

4) 只需在任何目标操作上正常使用请求

class ManageController extends AbstractActionController {

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

}

【讨论】:

    【解决方案2】:

    您不能使用 POST 数据重定向用户,但 ZF2 提供了模拟这一点的功能: http://framework.zend.com/manual/2.0/en/modules/zend.mvc.plugins.html#the-post-redirect-get-plugin

    【讨论】:

    • 嗨kierzniak,感谢您的回复,但这不是我想要的,仍然没有发布参数。我找到了一种方法,我会发布它。还是谢谢。
    【解决方案3】:

    此解决方案可能会有所帮助,但不是使用重定向,而是转发到另一个控制器。

    在将其转发到其他控制器之前,请替换(或更新)当前请求的 post 参数。然后接收控制器将看到替换(或更新)的帖子参数。

    // Controller that handles unauthorized access
    
    class YourController extends AbstractActionController
    {
    
        // ...
    
        $request   = $this->getEvent()->getRequest();
        $postParam = new \Zend\Stdlib\Parameters();
    
        $postParam->set('controller', 'manage');
        $postParam->set('action',     $lastRequest['action']);
        $postParam->set('name',       'your-name';
        $postParam->set('email',      'your-email';
    
        $request->setPost($postParam);
    
        return $this->forward()->dispatch('Your\Other\UserCreateController', [
            'action' => 'userCreate',
        ]);
    
        // ...
    
    }
    

    【讨论】:

      猜你喜欢
      • 2014-08-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-06
      • 2011-04-16
      • 2012-06-28
      • 2011-09-30
      相关资源
      最近更新 更多