我正在努力正确组织(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','');
}
目前,不同的“处理程序”(in set_data()
)正在查询数据库,但在此之前,我需要检查是否已提交必填字段以及这些字段是否有效(它们是否存在于数据库中)。我真的不知道在哪里放置这种验证。可能在一个单独的模型中,但是我必须再次查询那里的数据库和数据处理程序。也许你有一个想法?!