在ZF2中是否有可能在验证传入的POST变量之前对其进行操作?
我有一个表单,直到现在才从我们自己的应用程序接收POST数据。现在,我们希望允许外部应用程序将数据发布到此表单中。但是,我们没有完全控制其他应用程序,因此变量的名称不相同。
理想情况下,我的控制器应该检查是否存在其他POST变量(例如" someVarFromExternal")并将其用于我们的变量(" someVarFromMe")。这必须在验证之前的某个地方发生。
在普通的PHP中,这很简单。在验证之前的某个地方我可以说:
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()) {
...
}
}
}
在ZF2中我在哪里以及如何实现相同的目标?
我看到的唯一另一个选择是编写一个自定义验证器来处理这个问题,但对于我实际需要的少量变量交换来说似乎有些过分。
答案 0 :(得分:1)
POST变量位于我用
检索的ArrayObject中$postVars=$request->getPost();
由此,我使用getArrayCopy创建一个(非私有)数组。现在我可以操纵有问题的变量了。
最后,我从被操纵的数组中创建了一个类型为\ Zend \ Stdlib \ Parameters的新对象。我将其提供给表单进行验证。
我的控制器看起来像这样:
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()) {
...
}
}
}
作品!如果有人知道更好/更优雅的方式,请告诉我。
答案 1 :(得分:1)
更简单。没有必要创建帖子数据的完整副本。请看下面的例子。
$oRequest = $this->getRequest();
if ($oRequest->getPost()->get('someVarFromExternal')) {
$oRequest->getPost()->set('someVarFromMe', $oRequest->getPost()->get('someVarFromExternal'));
}
Zend Parameters对象使用get和set方法扩展本机ArrayObject类。使用此方法,您可以轻松扩展帖子数据。