4

私はしばらくの間phpを使用していますが、OOphpは初めてです。私自身の演習として、小さなMVCフレームワークを構築しています。

これに対する決定的な答えはおそらくないことを私は理解していますが、私は疑問に思っています:入力フィルター/検証コードはどこに属しますか?

リクエストが解析されるコントローラーの一部である必要がありますか?

または、各ドメインオブジェクトが独自の情報を検証する責任を負うように、ドメインモデルにフィルター/検証コードを含める方が適切ですか。

何かアドバイスをいただければ幸いです。

4

2 に答える 2

4

コントローラーは、いかなる方法、形状、形式でも検証の責任を負いません。コントローラは、ユーザーの入力に反応する責任があるプレゼンテーション層の一部です。それを疑うことはありません。

検証は主にドメインオブジェクトの責任であり、ドメインビジネスロジックのほとんどがモデルレイヤー内に配置されます。一部の検証は、 「データ整合性チェック」と呼ばれるものです(ユーザー名が一意であることを確認するなど)。これらの制約は、DB構造によって適用されます(UNIQUE特定の例やNOT NULL他のいくつかの制約のように)。データマッパー(またはその他のストレージパターン)を使用してドメインオブジェクトを保存する場合、が発生する可能性がありexceptionsます。これらの例外も、特定のドメインオブジェクトにエラー状態を設定するために使用される可能性があります。

フォームがある場合は、1つ以上のドメインオブジェクトに関連付けられ、フォームが投稿されると、フォームが検証されます。次に、現在のビューはモデルレイヤーに情報を要求し、エラー状態が設定されている場合は、適切な警告を表示します。

于 2012-08-21T05:06:46.480 に答える
1

コントローラは通常、リクエストデータ(GET / POST)を処理し、モデルが気にする必要のない無効なフォーム送信、CSRF、欠落しているフィールドなどを検出します。これは、ほとんどの場合、フィルタリングコードの大部分を記述する可能性が最も高い場所です。検証は、初期の障害の健全性チェックまでのみ行う必要があります(たとえば、有効な電子メールアドレスでない場合は、モデルに電子メールアドレスを送信する必要はありません)。

ドメインオブジェクトは検証フック(フィルタリングも)を提供する場合があります。これにより、コントローラーの責任が軽減されますが、ほとんどの場合、契約ベースのモデル(モデルは正当な値を渡すことを前提としています)を使用する方が簡単であるため、個人的には簡単です。検証の問題を特定のフォームフィールドに直接変換します。

前述の入力フィルタリング(およびコンテンツタイプの検証)とは異なりますが、モデル自体も検証を行う場合があります。たとえば、電子メールが有効な電子メールアドレスであることを確認するのではなく、データベースに電子メールが存在するかどうかを確認する場合があります。

于 2012-08-21T01:56:47.910 に答える