0

複数ページのフォームを検証するための(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をクエリ、データハンドラーで再度クエリを実行する必要があります。多分あなたはアイデアを思いついたのですか?!

4

1 に答える 1

1

私はあなたが使用している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));
于 2012-04-11T12:18:05.387 に答える