ZF2:如何在使用转发插件时为所有控制器全局更改Request对象?

时间:2015-04-17 04:54:51

标签: php zend-framework2 zend-framework-mvc apigility zend-framework-routing

我在测试和性能方面使用了前向插件。 首先IndexController数据通过正常的POST请求。 在那里,我得到了这个请求和POST数据,我需要再添加一个参数。

$this->getRequest()->getPost()->subsystem = 'avia';

比我使用前插件

$result = $this->forward()->dispatch(
        "Port\\Controller",
        [
            'controller' => 'Port\\Controller',
            'action'     => 'port',
        ]
    );

我在这个PortController中,我会再次收到我的请求POST数据,它应该包含我对IndexController的更改

$post              = $this->getRequest()->getPost();
isset($post['subsystem']) //true

但确实如此。它无需更改即可获得请求对象。

isset($post['subsystem']) //FALSE

如何在当前请求流程中全局更改所有控制器的请求?

我已经尝试了什么?

        //#1
        $params = $this->getServiceLocator()->get('ControllerPluginManager')->get('params');
        $params->getController()->getRequest()
               ->getPost()->subsystem
                = 'avia';

        //#2
        $this->getRequest()->getPost()->subsystem = 'avia';

        //#3
        $post              = $this->getRequest()->getPost();
        $post['subsystem'] = 'avia';
        //NEED UPDATE GLOBALLY !
        $this->getRequest()->setPost($post);

        //#4
        $event                                     = $this->getEvent();
        $event->getRequest()->getPost()->subsystem = 'avia';
        Debug::vars($event->getRequest()->getPost());

        //#5
        $_POST = $post->toArray();

所有这些差异都无效。

我已经阅读了这个答案 ZF2: How to pass parameters to forward plugin which I can then get in the method I forward them to?

但我不想通过参数传递数据,我需要更改请求。

UPD

但是现在我已经测试了,也许是因为在接收方那边我试图以这种方式获得请求

 $request = $this->bodyParams();

但我应该像这样使用它

if (!$request['subsystem']) {
      $request = $this->getRequest()->getPost()->toArray();
 }

这是因为我使用了Apigility RPC服务并在请求内容字段中以JSON格式放置了帖子数据,而不是在POST中。在另一个地方,我尝试了它

$params         = $this->serviceLocator->get('ControllerPluginManager')->get('params');
        $requestContent = $params->getController()->getRequest()->getContent();
        $request        = Json::decode($requestContent, Json::TYPE_ARRAY);

但是在我开始使用POST后,为什么它开始变得混乱。

1 个答案:

答案 0 :(得分:1)

我不确定这是否应该是你应该做的事情,但我认为你应该能够像这样实现它:

$parameters = $this->getRequest()->getPost();
$parameters->set('subsystem', 'avia');

$parametersZend\Stdlib\Parameters的实例。