データ検証に関して、次の 2 つのパターンのどちらかを決定しようとしています。
公称ワークフローに従い、モデルとサービスによってスローされた例外をキャッチしようとします: 一意/外部制約違反、空のフィールド、無効な引数など... (!! キャッチすべき例外のみをキャッチします)
長所:コントローラーとサービスに記述するコードがほとんどない: 例外を処理し、それらをユーザーが理解できるメッセージに転記するだけです。非常にシンプルで読みやすいコード。
短所:特定の例外を記述する必要があります。これは、さまざまな例外になる場合があります。また、データベース例外 (制約違反など) の一般的な PDO/Doctrine 例外をキャッチして解析し、それらを意味のある例外 (例: ) に変換する必要があります
DuplicateEntryException
。また、いくつかの検証をバイパスすることもできません。モデルのオブジェクトがロックされているとマークされているとしましょう。削除しようとすると例外が発生します。ただし、強制的に削除したい場合があります(たとえば、確認ポップアップを使用)。ここで例外をバイパスすることはできません。
コードと DB クエリを使用して、すべてを明示的にテストし、事前検証します。たとえば、モデルで属性として設定する前に、何かが null ではなく整数であることをテストします。または、DB クエリを作成して、重複するエントリを作成しないことを確認します。
長所:特定の例外を記述する必要はありません。なぜなら、すべてを事前検証するため、とにかく多くの try/catch を実行するべきではないからです。また、必要に応じて検証をバイパスすることもできます。
短所:コントローラー、サービス、およびモデルに書き込むための多くのテストと検証。さらにクエリを実行します(検証部分)。DBは、null列ではなく、外部キー、一意の制約の検証をすでに行っています...それを無視して自分で再コーディングするべきではありません。また、これは非常に退屈なコードにつながります!
物事をできるだけシンプルに保つために、ミックスではなく、どちらかのパターンを使用したいと思います。
最初の解決策は私には最高のように思えますが、それはある種のアンチパターンではないでしょうか? それとも、その理論的な単純さの裏に、非常に扱いにくい状況が隠されているのでしょうか?