Zend framework2 Zend Framework 2在验证之前操纵请求变量
ZF2中是否有可能在验证传入POST变量之前对其进行操作 我有一个表单,到目前为止,它只从我们自己的应用程序接收POST数据。现在,我们希望允许外部应用程序将数据发布到此表单中。但是,我们不能完全控制其他应用程序,因此变量的名称不相同 理想情况下,我的控制器应该检查是否存在其他POST变量(例如“someVarFromExternal”),并将其用于我们的变量(“someVarFromMe”)。这必须在验证之前的某个地方发生 在普通PHP中,这将非常简单。在验证之前的某个地方,我可以这样说:Zend framework2 Zend Framework 2在验证之前操纵请求变量,zend-framework2,Zend Framework2,ZF2中是否有可能在验证传入POST变量之前对其进行操作 我有一个表单,到目前为止,它只从我们自己的应用程序接收POST数据。现在,我们希望允许外部应用程序将数据发布到此表单中。但是,我们不能完全控制其他应用程序,因此变量的名称不相同 理想情况下,我的控制器应该检查是否存在其他POST变量(例如“someVarFromExternal”),并将其用于我们的变量(“someVarFromMe”)。这必须在验证之前的某个地方发生 在普通PHP中,这将非常简单。在验证之前的某个地方,我可以这样说: i
if($_POST['someVarFromExternal']){
$_POST['someVarFromMe'] = $_POST['someVarFromExternal'];
}
但是在ZF2中,我必须操作请求数据,这似乎是不可能的。我的控制器如下所示:
public function calculateAction() {
$form = new MyForm();
$request = $this->getRequest();
if ($request->isPost()) {
$myClassObject = new MyClass();
$form->setInputFilter($myClassObject->getInputFilter());
$form->setData($request->getPost());
if ($form->isValid()) {
...
}
}
}
public function calculateAction() {
$form = new MyForm();
$request = $this->getRequest();
if ($request->isPost()) {
$postVars=$request->getPost();
$postVarsCopy = $postVars->getArrayCopy();
if($postVarsCopy['someVarFromExternal']){
$postVarsCopy['someVarFromMe'] = $postVarsCopy['someVarFromExternal'];
}
$data=new \Zend\Stdlib\Parameters($postVarsCopy);
$myClassObject = new MyClass();
$form->setInputFilter($myClassObject->getInputFilter());
$form->setData($data);
if ($form->isValid()) {
...
}
}
}
我在何处以及如何在ZF2中实现同样的目标
我看到的唯一的另一个选择是编写一个定制验证器来处理这个问题,但对于我实际需要的少量变量交换来说,这似乎有点过头了。15分钟后,我找到了一个解决方案 POST变量位于我使用检索的ArrayObject中
$postVars=$request->getPost();
由此,我使用getArrayCopy创建了一个(非私有)数组。现在我可以操纵这个变量了
最后,我从操纵的数组中创建一个\Zend\Stdlib\Parameters类型的新对象。我将此信息输入表单进行验证
我的控制器如下所示:
public function calculateAction() {
$form = new MyForm();
$request = $this->getRequest();
if ($request->isPost()) {
$myClassObject = new MyClass();
$form->setInputFilter($myClassObject->getInputFilter());
$form->setData($request->getPost());
if ($form->isValid()) {
...
}
}
}
public function calculateAction() {
$form = new MyForm();
$request = $this->getRequest();
if ($request->isPost()) {
$postVars=$request->getPost();
$postVarsCopy = $postVars->getArrayCopy();
if($postVarsCopy['someVarFromExternal']){
$postVarsCopy['someVarFromMe'] = $postVarsCopy['someVarFromExternal'];
}
$data=new \Zend\Stdlib\Parameters($postVarsCopy);
$myClassObject = new MyClass();
$form->setInputFilter($myClassObject->getInputFilter());
$form->setData($data);
if ($form->isValid()) {
...
}
}
}
工作!如果有人知道更好/更优雅的方法,请告诉我。15分钟后,我找到了解决方案 POST变量位于我使用检索的ArrayObject中
$postVars=$request->getPost();
由此,我使用getArrayCopy创建了一个(非私有)数组。现在我可以操纵这个变量了
最后,我从操纵的数组中创建一个\Zend\Stdlib\Parameters类型的新对象。我将此信息输入表单进行验证
我的控制器如下所示:
public function calculateAction() {
$form = new MyForm();
$request = $this->getRequest();
if ($request->isPost()) {
$myClassObject = new MyClass();
$form->setInputFilter($myClassObject->getInputFilter());
$form->setData($request->getPost());
if ($form->isValid()) {
...
}
}
}
public function calculateAction() {
$form = new MyForm();
$request = $this->getRequest();
if ($request->isPost()) {
$postVars=$request->getPost();
$postVarsCopy = $postVars->getArrayCopy();
if($postVarsCopy['someVarFromExternal']){
$postVarsCopy['someVarFromMe'] = $postVarsCopy['someVarFromExternal'];
}
$data=new \Zend\Stdlib\Parameters($postVarsCopy);
$myClassObject = new MyClass();
$form->setInputFilter($myClassObject->getInputFilter());
$form->setData($data);
if ($form->isValid()) {
...
}
}
}
工作!如果有人知道更好/更优雅的方式,请告诉我。更简单。不需要创建post数据的完整副本。看看下面的例子
$oRequest = $this->getRequest();
if ($oRequest->getPost()->get('someVarFromExternal')) {
$oRequest->getPost()->set('someVarFromMe', $oRequest->getPost()->get('someVarFromExternal'));
}
Zend Parameters对象使用get和set方法扩展本机ArrayObject类。使用这种方法,您可以轻松地扩展post数据。它甚至更简单。不需要创建post数据的完整副本。看看下面的例子
$oRequest = $this->getRequest();
if ($oRequest->getPost()->get('someVarFromExternal')) {
$oRequest->getPost()->set('someVarFromMe', $oRequest->getPost()->get('someVarFromExternal'));
}
Zend Parameters对象使用get和set方法扩展本机ArrayObject类。使用这种方法,您可以轻松地扩展post数据