2012-04-03 16 views
8

私はCodeIgniterを使用してWebアプリケーションのほとんどを開発していますが、このデータをモデルに送信する前に、組み込みのフォーム検証クラスを使用してコントローラ内のフォームデータを検証する方法例えば、データをデータベースに挿入することができます。MVCアーキテクチャでのデータとフォームの検証

しかし、私は「スキニーコントローラ、太いモデル」のラインを聞いています。これらの検証チェックをモデルの中に入れなければならないのだろうかと思います。

私はこのアプローチを使用すると3つのことがわかります。

  1. これらのモデル関数から一見醜い配列やオブジェクトを返すことなく、さまざまなエラーメッセージをユーザーに表示する方法を教えてください。例:アカウントのサインアップ時に重複したメール。モデル内のユーザーを追加するメソッドは、挿入が成功したかどうかを示す配列またはオブジェクトとエラーメッセージを返す必要がありますか?

  2. モデルの妥当性チェックを行い、POSTデータではなくコントローラからメソッドに渡された変数をチェックすることで、プロジェクトで非常に役立つクラスであるForm Validationクラスの使用を失います。フォームバリデーションクラスを模倣するためにCIライブラリのように使用できるクラスやライブラリを記述することをお勧めしますか?

  3. この問題に続き、モデルに渡される前にPOSTデータの存在を検証する必要があるため()、残りの検証はコントローラに配置するだけではありませんか?

ご意見、ご意見、ご感想ありがとうございます。

答えて

4

あなたの元の問題は、CodeIgniterのMVCの解釈が非常に面白いという事実から来ています。このフレームワークは、Viewは単なるテンプレートであり、Modelは単なるORM(which some say, should be classified as anti-pattern)であるとふりまとめています。これは完全に間違っていて、コントローラ内でボットビジネスとプレゼンテーションロジックを強制します。

ただし、表示を脇に置いておきます。

MVCのモデルは、クラスまたはオブジェクトではありません。 モデルはすべてのビジネスロジックを含むレイヤーです。実際には、多数のクラスからのインスタンスで構成されています。二つの最も普及しているグループのドメイン オブジェクト  は[1]   [2]及び情報記憶および検索を行うオブジェクト(これは、人々の人々は通常、「モデル」と呼んでいるもの、である)されている - 通常DataMappers。モデルレイヤーには、スタンドアロンコンポーネント(自分自身と第三者の両方)とより高いレベルの抽象化 - サービスも含まれています。

あなたはValidationクラスとして持ってどのような、どちらかの検証を行い、またはドメインオブジェクトは、検証のために渡されることを期待するドメインオブジェクトで使用することができ、スタンドアロンのコンポーネントであると考えられるかもしれない。..依存あなたの実装で。

あなたの状況で私はこれをサービス層で処理します。これは、Viewクラスのインスタンスに有効なドメインオブジェクトを提供するか、エラーを表すオブジェクトを提供します。中

いくつかの読み物湯があるかもしれない興味:地獄は、私はそれをすべての知っていることを再度その後

..

+0

ニースの答え、+1。 –

+0

あなたの非常に詳細な応答をお寄せいただきありがとうございます - 私はいくつかのリンクを読みました。したがって、モデルのメソッド内で検証し、データオブジェクトまたはエラーを記述/表すオブジェクトのいずれかを返すアプローチがあると示唆していますか? idが指定されている場合、エラーメッセージとステータスコードを持つオブジェクトを返さない場合 は、例えば、ユーザレコードを取得するための方法で は、、、など あなたが扱うだろうか、これをユーザーのオブジェクトを返しますコントローラーで? – Sam

+0

@Sam、もしあなたがActiveRecordオブジェクトを使いたいのであれば、それを内部に持っていなければなりません。バリデーターをオブジェクトに渡し、その後、同じ時点でフィールドのセットに対して検証を実行する、ある種のセッターを作成する必要があります。そして、エラーが発生した場合、例外をスローすることができます。例外はコントローラで処理されます(実際にはCIでは「プレゼンタ」レベルです)。 –

関連する問題