1

最近、フォームデータの検証をモデルレイヤー、特にドメインオブジェクトセッターに移動しました(これは正しいですか、間違っていますか?)。私がUser奉仕しているとき、私はこれをします

$user->setFirstName($firstName);

入力が長すぎる(25文字を超える)ドメインオブジェクトのある種のstate変数を不安定(おそらく= 0)に設定し、ビューで取得するためにモデルのエラーメッセージを設定する必要がありますか?

isValid()メソッドを実行して、ビュー内のオブジェクトの状態を確認します。

これはそれを行う正しい方法でしょうか?

ありがとう。

4

2 に答える 2

0

これはアーキテクチャの問題であり、多くの答えがあります。Grails Web フレームワークはこれに似たアプローチを採用していますが、自動的に魔法のようvalidate()にドメイン オブジェクトに追加します。CodeIgniter では、独自の同様の.

個人的には、セッター/コンストラクターに検証ロジックを入れて、前提条件が満たされない場合に例外をスローするのが好きです。つまり、オブジェクトが有効かどうかを確認するためにビューが問い合わせる必要があるのではなく、ユーザーは有効なデータを入力するか、そうでない場合は明示的に処理する必要があります。

于 2013-02-24T09:50:31.223 に答える
0

フォームの検証は、ドメイン オブジェクトでは何の関係もないと思います。送信されたフォームが無効な場合、通常、ドメイン オブジェクトを作成/変更する理由はまったくありません。これは、完全にプレゼンテーション層/ユーザー インターフェイスにある問題です。ユーザー入力の検証をドメイン オブジェクトに入れることは、関心の分離の原則に違反します。

ただし、これは物議を醸す問題であり、絶対に正しい方法や間違った方法はありません。ドメイン オブジェクトが無効な状態 (コンストラクターとセッターで例外をスローする) にならないようにしたい場合は、コードが重複してしまう可能性があるためです。

ただし、フォームの検証にドメイン オブジェクトで検証を使用するかどうかにかかわらず、isValid状態よりも例外を優先する必要があります。オブジェクトは常に有効な状態でなければなりません。これは OOP の大きな利点の 1 つです。

アップデート

入力検証をどこに置くかという質問に対して: 私は各コントローラーに特殊な要求オブジェクトを使用し、コントローラーで次のように使用します。

try {
    $user = $this->request->extractUserFromPost();
} catch (ValidationException $e) {
    $this->showValidationError($e->getMessage(), $e->getAffectedFields());
}

メソッドはコントローラー自体にもありますが、独自のロジックをできるだけ含まないシン コントローラーを好みます。もう 1 つの一般的な方法は、フォームの生成と検証を 1 か所で管理するフォーム オブジェクトです (例: Zend\Form)。リクエストが常にフォームから来る場合、これは理にかなっています。上記の例は、HTML ユーザー インターフェイスだけでなく、Web サービスでも機能します。

于 2013-02-24T10:31:21.770 に答える