5

Model-View-Controllerデザインパターンを使用するWebベースのアプリケーションでは、フォーム送信の処理に関連するロジックは、ModelレイヤーとControllerレイヤーの間のどこかに属しているように見えます。これは、複雑なフォームの場合(つまり、フォーム処理が単純なCRUD操作をはるかに超えている場合)に特に当てはまります。

これを概念化するための最良の方法は何ですか?フォームは単にモデルとコントローラーの間の一種の接着剤ですか?それとも、フォームロジックはMまたはCキャンプに正直に属しますか?

編集:MVCアプリケーションの基本的な情報の流れを理解しています(要約については、chills42の回答を参照してください)。私の質問は、フォーム処理ロジックがどこに属するかです-コントローラー、モデル、または他の場所ですか?

4

4 に答える 4

4

これはおそらく2つの別々のアクションと見なされるべきだと思います...

  1. フォームの送信 (V -> C)
  2. 提出物を処理中 (C -> M)

総称的に言えば、各アクションをセクション間のメッセージと考える傾向があります。一連のメッセージ全体は次のようになります...

  • 表示形式 (C -> V)
  • ユーザーが提出 (V -> C)
  • 処理内容(C→M)
  • 処理済み (M -> C)
  • 結果の表示 (C -> V)
于 2008-12-05T19:52:18.207 に答える
3

最初はV->C、C-> M、M-> Cを使用するという考えは良さそうですが、フォームを変更するには、コントローラー+モデル+ビューをいじる必要があります。アプリケーションロジックを単純に保つために、これは避ける必要があります。これは、フォーム処理ロジックを別のクラスに委任し、MVCアーキテクチャを維持してアプリケーションロジックを処理することにより、Webフォーム処理を非常に簡単に処理できるようにするフレームワークの非常に単純な拡張機能です。

処理する必要のあるフォームごとに、汎用の「webform」クラスまたはcodeigniterモデルクラスから派生したクラスを作成します。このクラスにvalidate()、process()、display()などのメソッドを追加します。

コントローラでは、コードは次のようになります。

class User_controller
{

    function login()
    {
        $form = new LoginForm(); // this is the class you would create
        if ($form->validate())
        {
            $data = $this->user_model->getUserData( $form->userid );
            // form processing complete, use the main "user" model to fetch userdata for display,
            // or redirect user to another page, update your session, anything you like
        } else {
            $form->display();
        }
    }
}

フォームクラスのdisplayメソッドは、独自のビューをロードし、必要に応じてポストバックデータを入力します。上記を使用することにより、いくつかの利点があります。

  • フォームの表示や処理を変更する必要がある場合は、メインコントローラーを変更する必要はありません。

  • ユーザーモデルを変更する必要もありません

  • コントローラはクリーンなままで、メインページのロジックを処理します

  • ユーザーモデルはクリーンなままで、データベースとのみ対話します

フレームワーク自体を更新して、Webフォームを使用してロードできるようにすることができます。

$ this-> load-> form( "login"); .....。

ただし、これはcodeigniterチームに役立つ提案にすぎません。

于 2010-04-14T07:20:08.780 に答える
3

chills42 に同意しますが、可能な限りモデルに詰め込みます。
ユーザーが (V->C) を送信すると、それは何らかのコントローラーに送信されます。私は、コントローラーが単にディスパッチャーとして機能し、単純なデータ ポイントに基づいて次に何が起こるかを決定するのが最善であると主張します。モデルにメソッド (通常は厳密には ORM またはアクティブ レコード ベースではない) を持たせて生データを処理し、必要に応じてデータベースに保存してから、単にステータスを返すかエラーをスローします。

于 2010-03-26T18:05:33.233 に答える
1

フォーム処理はモデルで行う必要があります。これは、ビューを介してコントローラーからデータを受信して​​処理するアプリケーションのレイヤーであるためです。コントローラーはそれを動かしますが、実際のコード実行に関しては、モデル内で発生するはずです。

于 2010-03-26T18:19:58.050 に答える