ZF2:使用转发插件时如何全局更改所有控制器的请求对象?
ZF2: How to change Request object globally for all Controllers when using forward plugin?
我正在使用 forward 插件进行测试和性能测试。
首先 IndexController
数据通过正常的 POST 请求。
我得到了这个请求和 POST 数据,我需要再添加一个参数。
$this->getRequest()->getPost()->subsystem = 'avia';
比我用forward插件
$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
如何全局更改当前请求进程中所有控制器的Request?
我已经在尝试什么了?
//#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 数据,而不是 POST。在另一个地方我试着得到它
$params = $this->serviceLocator->get('ControllerPluginManager')->get('params');
$requestContent = $params->getController()->getRequest()->getContent();
$request = Json::decode($requestContent, Json::TYPE_ARRAY);
但是在我开始使用POST之后,这就是它开始混淆的原因。
我不确定这是否真的是你应该做的事情,但我认为你应该能够像这样实现它:
$parameters = $this->getRequest()->getPost();
$parameters->set('subsystem', 'avia');
$parameters
是 Zend\Stdlib\Parameters
.
的实例
我正在使用 forward 插件进行测试和性能测试。
首先 IndexController
数据通过正常的 POST 请求。
我得到了这个请求和 POST 数据,我需要再添加一个参数。
$this->getRequest()->getPost()->subsystem = 'avia';
比我用forward插件
$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
如何全局更改当前请求进程中所有控制器的Request?
我已经在尝试什么了?
//#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 数据,而不是 POST。在另一个地方我试着得到它
$params = $this->serviceLocator->get('ControllerPluginManager')->get('params');
$requestContent = $params->getController()->getRequest()->getContent();
$request = Json::decode($requestContent, Json::TYPE_ARRAY);
但是在我开始使用POST之后,这就是它开始混淆的原因。
我不确定这是否真的是你应该做的事情,但我认为你应该能够像这样实现它:
$parameters = $this->getRequest()->getPost();
$parameters->set('subsystem', 'avia');
$parameters
是 Zend\Stdlib\Parameters
.