是否可以将数据转发到Zend 2中的另一个控制器/操作?

时间:2013-01-06 09:28:11

标签: redirect zend-framework2 forward

我认为一个常见的问题是尝试将数据转发(发布)到另一个页面。通常情况下,我会使用会话来在页面之间传递数据,但Zend中的这个前向助手看起来有潜力。有没有办法获得有关转发请求的信息?就像要求转发器一样(当没有转发器时它通常会返回null)?

如果目前没有实施,是否可能?这将是一个有趣的项目,无论如何我永远都想要的东西。 (我现在也在使用自己的BcryptDbTableAuth类,直到找到更好的解决方案。)

顺便说一下,我不是在谈论添加请求参数。它应该对用户不可见。而且我还在调查变量路线(Wildcard应该可以做到这一点,但我不断得到“路线无法匹配”......将继续钻探更多)

1 个答案:

答案 0 :(得分:19)

“前进”有两种选择。理解php是服务器端语言处理器,用于获取传入请求并返回响应。

也就是说,第一个“前进”使用框架内转发。这意味着只有一个请求和一个响应。框架内部调用一个控制器操作,然后调用另一个操作符。 Zend Framework将此方法称为前进

第二个“转发”是一个真正的重定向,其中第一个响应包含Location标头和302 http状态代码。这导致第二个请求并且连续地在第二个响应中。 Zend Framework将此方法称为重定向

所以在上面,你在问题中谈到的 forward 不涉及任何会话或路由匹配参数,因为对动作的第二次调用是在同一个php进程中,所以所有变量都是已经知道了。

转发示例

转发的一个例子是使用forward控制器插件:

class MyController
{
  public function myAction()
  {
    return $this->forward()->dispatch('MyModule\Controller\Other', array(
      'action' => 'other',
      'foo'   => 'bar',
      'baz'   => new Bat()
    ));
  }
}

访问:

class OtherController {
    public function otherAction()
    {
        $foo = $this->params()->fromRoute('foo');
    }
}

您可能会注意到,可以在前向呼叫中添加其他参数,包括真实对象。

重定向示例

一个选项是使用路由参数,因此您可以捕获您发回的网址中的数据。因为你说你不想要那个,你必须使用一个会话:

use Zend\Session\Container;

class MyController
{
  public function myAction()
  {
    $session = new Container('MyContainer');
    $session->foo = 'bar';
    $session->baz = 'bat';

    return $this->redirect()->toRoute('my/other/route');
  }
}