4

MVC について学び始めて以来、コントローラーでフォーム データを常に検証してきました。これは、CodeIgniters コードをざっと読んでいるときに身につけた習慣ですが、特定の操作を実行する方法が最善ではないことを学びました。終わり。

すべてのフォーム データをドメイン オブジェクトで検証する必要がありますか? もしそうなら、セッターでそのように行うべきです

public function setFirstName($firstName) {

    // Check if the field was required
    if(!$firstName) {
        throw new InvalidArgumentException('The "First name" field is required');
    }

    // Check the length of the data
    // Check the format 
    // Etc etc
}

また、たとえば、基本的なユーザー登録を処理している場合、Userクラスには$confirmPasswordプロパティがないため、実行しません

$user->setConfirmPassword($confirmPassword);.

入力した 2 つのパスワードが等しいかどうかを確認する 1 つの方法は、 を設定して次の$passwordようにすることです。

$user->setPassword($password);
if(!$user->matchPassword($confirmPassword)) {
    throw new PasswordsNotEqualException('Some message');
}

これはサービスレイヤーで行われると思いますか?

正しい方向に私を助けるためのアドバイスは素晴らしいでしょう。ありがとう。

4

2 に答える 2

3

すべてのフォーム データをドメイン オブジェクトで検証する必要がありますか? もしそうなら、セッターでそのように行うべきです

IMOは、有効なオブジェクトの作成のみを許可する必要があります。これをアーカイブする最良の方法は、オブジェクトを作成するメソッドでこれらのチェックを行うことです。

ユーザーの名前を変更できないと仮定すると、ユーザーの作成時にそれを検証します。このようにして、セッターはもう必要ないので忘れてしまいます。

プロパティを変更したい場合があり、それらも検証する必要があります (その場合、変更によって有効なオブジェクトが無効なオブジェクトに変わる可能性があるため)。

入力した 2 つのパスワードが等しいかどうかを確認する 1 つの方法は、$password を設定して次のようにすることです...

これも同じ方法で処理できます。作成時にパスワードと確認の両方をチェックする Password オブジェクトを用意します。有効な Password インスタンスがあれば、指定したすべての検証に合格したことを認識して使用できます。

参考文献

これらの設計原則 (最初から完全で有効なオブジェクトなど) は、Hernan Wilkinson の "Design Principles Behind Patagonia" からのものです。必ずESUG 2010 ビデオプレゼンテーション スライドを確認してください。

私は最近、プロパティの検証に関する別の質問に答えました

乾杯!

于 2013-02-23T14:24:44.907 に答える
3

TL;DR

いいえ、セッターはデータを検証するべきではありません。そしてnick2083は完全に間違っています。

ロングバージョン...

Tim Howard が提供した定義[source]によると、ドメイン オブジェクトは、含まれているドメイン情報の状態を検証できます。これは基本的に、ドメインオブジェクトを実際に持つには、オブジェクトがそれ自体を検証できる必要があることを示しています。

いつ検証するか

基本的にオプションが必要です:

  • 各セッターで検証
  • オブジェクト全体を検証する 1 つのメソッドを持つ

バリデーションがセッターの一部である場合、大きな欠点が 1 つあります。それは、セッターの順序が重要であることです。

例:生命保険に関するアプリケーションを作成しているとします。ポリシーがトリガーされたとき (被保険者が死亡した場合)、被保険者と保険料を受け取る人を含むドメイン オブジェクトがある可能性は非常に高くなります。受取人と被保険者が同一人物でないことを確認する必要があります。ただし、セッターを実行する順序を管理する規則はありません。

相互に検証する必要があるドメイン オブジェクトに 2 つ以上のパラメーターがある場合、実装は少しあいまいになります。最も実現可能な解決策は、すべてのパラメーターがいつ割り当てられるかを確認することですが、その時点で、セッター内の検証の利点をすでに失っています。

21そして、パラメータ B が大きく、C がすでに設定されている場合に、ドメイン オブジェクトの有効な状態でパラメータ A が設定されていない状況にどのように対処しますか?

結論:セッターでの検証は、非常に単純なドメイン オブジェクトがあり、複雑な検証ルールがない場合にのみ実行可能なソリューションです。

于 2013-02-23T17:40:55.893 に答える