Zend framework2 Zend Framework 2在验证之前操纵请求变量

Zend framework2 Zend Framework 2在验证之前操纵请求变量,zend-framework2,Zend Framework2,ZF2中是否有可能在验证传入POST变量之前对其进行操作 我有一个表单,到目前为止,它只从我们自己的应用程序接收POST数据。现在,我们希望允许外部应用程序将数据发布到此表单中。但是,我们不能完全控制其他应用程序,因此变量的名称不相同 理想情况下,我的控制器应该检查是否存在其他POST变量(例如“someVarFromExternal”),并将其用于我们的变量(“someVarFromMe”)。这必须在验证之前的某个地方发生 在普通PHP中,这将非常简单。在验证之前的某个地方,我可以这样说: i

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()) {

            ...
        }
    }
}
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数据