Zend Framework 2在验证之前操作请求var

时间:2018-02-02 14:04:38

标签: zend-framework2

在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中我在哪里以及如何实现相同的目标?

我看到的唯一另一个选择是编写一个自定义验证器来处理这个问题,但对于我实际需要的少量变量交换来说似乎有些过分。

2 个答案:

答案 0 :(得分:1)

15分钟后,我找到了解决方案。

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类。使用此方法,您可以轻松扩展帖子数据。