複数ページのフォームを検証するための(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()
)がデータベースにクエリを実行していますが、その前に、必須フィールドが送信されているかどうか、およびそれらのフィールドが有効かどうか(データベースに存在するかどうか)を確認する必要があります。そのような検証をどこに置くべきか、私にはよくわかりません。おそらく別のモデルですが、そこでDBをクエリし、データハンドラーで再度クエリを実行する必要があります。多分あなたはアイデアを思いついたのですか?!