Php 如何编写用于验证多页表单的控制器?

Php 如何编写用于验证多页表单的控制器?,php,forms,model-view-controller,validation,Php,Forms,Model View Controller,Validation,我正在努力正确组织(MVC)控制器来验证多页表单。问题是,我不仅必须检查用户输入是否存在,而且还必须将其与不同的数据库进行匹配(取决于字段)。我还需要从不同视图选项的用户输入中得到的数据库数据 我根本不清楚我应该把验证放在哪里。我不想把太详细的东西放到控制器中,但同时我不喜欢模型之间相互使用(没有控制器) 以下是一个控制器的基本示例,步骤代表表单的不同阶段/页面: // GET VARIABLES FROM $_POST + $_GET private function make_environ

我正在努力正确组织(MVC)控制器来验证多页表单。问题是,我不仅必须检查用户输入是否存在,而且还必须将其与不同的数据库进行匹配(取决于字段)。我还需要从不同视图选项的用户输入中得到的数据库数据

我根本不清楚我应该把验证放在哪里。我不想把太详细的东西放到控制器中,但同时我不喜欢模型之间相互使用(没有控制器)

以下是一个控制器的基本示例,步骤代表表单的不同阶段/页面:

// GET VARIABLES FROM $_POST + $_GET
private function make_environment()
{
    // PUT ALL VARIABLES INTO ARRAY
    $vars = array();
    if(!empty($_GET)) { $values = array_merge($vars,$_GET); }    
    if(!empty($_POST)) { $values = array_merge($vars,$_POST); }

    // PUT ALLOWED VARIABLES INTO PROPERTY
    foreach($this->properties as $property)
    {
        if(isset($values[$property]))
        {
            $this->properties[$property] = htmlspecialchars(trim($values[$property]));
        }
    }

}


// HANDLE DATA


// PRODUCES DATA FOR VIEW    
private function set_data()
{
    $data = '';
    // CHOOSE DATA-OBJECT AND DATA-HANDLER
    switch($this->properties['step'])
    {
        case 1:
            // DATA HANDLER
            $handler = new calendar($this->properties);
            $data['calendar'] = $handler->return_data();
            break;

        case 2:
            // DATA HANDLER
            $handler = new form($this->properties);
            $data['form'] = $handler->return_data();
            break;
    }

    return $data;
}


// CREATE OR UPDATE VIEW

private function run_view($data)
{
    new view('header','');

    switch($this->properties['step'])
    {
        default:
            new view('chooser','');
            break;
        case 1:
            new view('calendar',$data['calendar'],$this->properties);
            break;

        case 2:
            new view('form',$data['form'],$this->properties);
            break;
    }

    new view('footer','');
}

目前,不同的“处理程序”(在
set_data()
中)正在查询数据库,但在此之前,我需要检查所需字段是否已提交,以及这些字段是否有效(数据库中是否存在)。我真的不知道该把这种验证放在哪里。可能是在一个单独的模型中,但是我必须再次在数据处理程序中查询数据库。也许你有主意了

我不知道您使用的MVC,但我更喜欢这样:

$form = new MultipageForm('BubblePagesForm');
$form->importFromSession($app->getSession());
if ($form->validates($app->getRequest()))
{
    $form->processRequest($app->getRequest());
    $form->exportToSession($app->getSession());
    $responseType = new SuccessfullFormRequest($form);
}
else 
{
    $responseType = new InvalidFormRequest($form);
}
$app->setResponse($responseType, array($form));

如果某个吝啬鬼试图从已处理的请求中更改表单数据会怎么样?这将允许他使用错误的表单数据访问更高级别的表单。问题是我不能使用会话,所以我必须依靠post和get,这很容易操作。@DanSurfrider:不,表单的状态保存到会话中。这就是为什么会有
importFromSession
exportToSession
。表单知道何时处理请求,请求属于表单的哪个页面/步骤。以前的数据无法在客户端(仅在会话存储区内的服务器端)更改。很抱歉,我忘了提到我不想使用会话,所以我不得不依靠post,不幸地得到了解决。@DanSurfrider:你总是遇到你不想遇到的问题。因此,要么使用服务器端存储,要么使用客户端存储。如果您使用客户端存储来存储会话数据,那么它就可以被操纵——始终如此。当心。