フォームの検証は、ドメイン オブジェクトでは何の関係もないと思います。送信されたフォームが無効な場合、通常、ドメイン オブジェクトを作成/変更する理由はまったくありません。これは、完全にプレゼンテーション層/ユーザー インターフェイスにある問題です。ユーザー入力の検証をドメイン オブジェクトに入れることは、関心の分離の原則に違反します。
ただし、これは物議を醸す問題であり、絶対に正しい方法や間違った方法はありません。ドメイン オブジェクトが無効な状態 (コンストラクターとセッターで例外をスローする) にならないようにしたい場合は、コードが重複してしまう可能性があるためです。
ただし、フォームの検証にドメイン オブジェクトで検証を使用するかどうかにかかわらず、isValid
状態よりも例外を優先する必要があります。オブジェクトは常に有効な状態でなければなりません。これは OOP の大きな利点の 1 つです。
アップデート
入力検証をどこに置くかという質問に対して: 私は各コントローラーに特殊な要求オブジェクトを使用し、コントローラーで次のように使用します。
try {
$user = $this->request->extractUserFromPost();
} catch (ValidationException $e) {
$this->showValidationError($e->getMessage(), $e->getAffectedFields());
}
メソッドはコントローラー自体にもありますが、独自のロジックをできるだけ含まないシン コントローラーを好みます。もう 1 つの一般的な方法は、フォームの生成と検証を 1 か所で管理するフォーム オブジェクトです (例: Zend\Form
)。リクエストが常にフォームから来る場合、これは理にかなっています。上記の例は、HTML ユーザー インターフェイスだけでなく、Web サービスでも機能します。