【问题标题】:Is it possible to forward data to another controller/action in Zend 2?是否可以将数据转发到 Zend 2 中的另一个控制器/动作?
【发布时间】:2013-01-06 09:28:11
【问题描述】:

我认为一个常见的问题是试图将数据转发(发布)到另一个页面。通常,我会求助于会话在页面之间传递数据,但是 Zend 中的这个前向助手看起来很有潜力。有什么方法可以获取有关转发请求的信息?比如请求转发器(如果没有转发器,它通常会返回 null)?

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

顺便说一句,我不是在谈论添加请求参数。它应该对用户不可见。而且我仍在研究可变路线(通配符应该可以解决问题,但我不断收到“路线无法匹配”......将进一步研究)

【问题讨论】:

    标签: redirect zend-framework2 forward


    【解决方案1】:

    “转发”有两个选项。理解 php 作为服务器端语言是一种处理器,用于抓取传入的请求并返回响应。

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

    第二个“转发”是真正的重定向,其中第一个响应包含Location 标头和302 http 状态代码。这会产生第二个请求并连续产生第二个响应。 Zend Framework 调用此方法redirect

    因此,您在问题中谈到的 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');
        }
    }
    

    您可能会注意到,可以向转发调用添加其他参数,包括真实对象。

    重定向示例

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

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

    【讨论】:

    • 如何访问转发的变量?我试过$this->params('foo') 没有运气。看源码,好像放在RouteMatch里面。我不想在我的模块配置中硬编码可选路由,因为它们是选择页面使用的杂项值。我不介意通配符路线,但我遇到了这个问题(而且它对我来说不是固定的,甚至更新了 Zf2 github.com/zendframework/zf2/issues/2861
    • 变量应该能够从路由匹配中获取。不再有限制,参数应该遵循路由本身的参数。它必须适用于任何类型的路线(文字和段),我会看看并更新我的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多