繰り返しの長い検証コードに対処するための良いアプローチは何ですか?
-
07-07-2019 - |
質問
Webプログラミングを始めたばかりで、検証ライブラリを使用しているにもかかわらず、エラーメッセージやコールバック関数をカウントせずに、検証だけで20〜30行のコードを取得できることに驚いています。私はKohana MVCフレームワークを使用していますが、検証コードを短縮できる方法があるかどうか疑問に思っていました。次のことを考えてみました
- モデルに検証コードを入力します(これは私のような初心者にはかなりあります)。
- エントリを検証するための非常に小さなライブラリを作成する(検証クラスにフックするため、ユーザー登録、編集などの繰り返し手順のためにライブラリを呼び出すことができます)
またはより良い、より効率的な方法はありますか?
解決
検証をモデルに含めることを強くお勧めします。一度できるようになったら、作成する他のすべての作業がはるかに簡単になります。さらに、そのデータを保存しようとする複数のコントローラーがある場合、検証を再コーディングする必要はありません。 Kohanaのドキュメントには、検証ライブラリとORMを統合するためのいくつかの例が含まれています。そこから始めてください。
他のヒント
検証のためにZend_ValidateとZend_Formsを使用します。検証コードはフォームのinitメソッドにあります。私がしなければならないことは、各要素にバリデーターの配列を渡してから実行することです..
$form->isValid($data);
...フォームの外側でデータを検証します。
各配列エントリを改行で区切るので、検証配列は30行以上に簡単になります。しかし、各要素にきめの細かい検証ルールを定義すれば、それがあると思います。
そして、Zendで新しいバリデータを簡単に定義できます。
edit:ドメインオブジェクトに独自の検証を含めることができるZend Frameworkを拡張するフレームワークを発見しました。そのXysterフレームワークと呼ばれますが、最初の試行で動作させることができなかったため、その後は試していません。
検証コードを扱うための私の戦略です。 「検証ライブラリ」とは、メールがメールであり、電話番号が数字であり、本質的にビジネスルールではないことを確認するものを意味すると思います。
アイデアは、各ビジネスルールコードをファンクターとして使用することです。PHPの場合は、文字列を使用して関数を定義するだけで取得できます。他の言語では、戦略パターンを使用する必要がある場合があります。ファンクターのインターフェースを定義し(PHPには不要)、配列にダンプします。
成功、エラー、エラーコードをバッファに返す配列を実行します。最後に、エラーバッファを調べて、どの検証が失敗したかを判断します。ビューをカスタマイズするために使用します。
例を示します
$checkUniqueUserName = new CheckUniqueUserName();
$checkEmailNotUsed = new EmailNotUsed();
$validator = array();
$validator[$checkUniqueUserName->name()] = $checkUniqueUserName;
$validator[$checkEmailNotUsed->name()] = $checkEmailNotUsed;
$results = array();
foreach ($validator as $v)
{
$result[$v->getValidatorName()] = $v->execute($userInfo);
}
class CheckUniqueUserName()
{
public function execute($userInfo)
{
// SQL blah blah blah
if ($bNameUnique)
return array ('success' => 1)
else
return array ('success' => 0, 'error' => "$name is in used", 'error_code' => 'duplicate_name);
}
}
最後に、検証プロセスで満たされた結果の配列があり、どれが失敗し、どれが失敗していないかがわかります。これは、失敗したフィールドを強調表示するなど、さらに処理するためにクライアント側に渡すことができます。 error_codeを使用して、適切なエラーメッセージとそれに適用されるフォーマットを検索します。
ただし、コールバックの意味がよくわかりません。