在用户尝试未经授权的操作之前,我保存:
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);
它确实重定向,但没有发布params。
如何从控制器模拟ZF2上的POST请求? 关键是我不知道用户将被重定向到哪里,因此它可以是GET或POST以及任何控制器。
答案 0 :(得分:5)
这是我保存请求的方式,稍后再使用它来重定向到正确的操作。
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();
}
}
答案 1 :(得分:1)
您无法使用POST数据重定向用户,但ZF2提供了模拟此功能的功能: http://framework.zend.com/manual/2.0/en/modules/zend.mvc.plugins.html#the-post-redirect-get-plugin
答案 2 :(得分:0)
此解决方案可能有所帮助,但它不会使用重定向,而是转发到另一个控制器。
在将其转发给其他控制器之前,请替换(或更新)当前请求中的post params。然后接收控制器将看到替换(或更新)的邮件参数。
// 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',
]);
// ...
}