0


1

現在、私はオブジェクトを作成し、そのセッターを使ってクライアントから受け取ったget / postデータを設定します。 そして、save()関数を呼び出す前にvalidate()を呼び出してください。

//member registration
$ m = new Member(); $ m  - > setName($ _ POST ['名前']); $ m  - > setBirthDate($ _ POST ['birthdate']); $ m  - > setAddress($ _ POST ['アドレス']);

$ arrOfErrMsgs = $ m-> validate();

if(!empty($ arrOfErrMsgs)){
//echo some error messages to client or redirect to a page that shows the error
出口(); }

$ saveSuccess = $ m-> save(); //安全のため、このsave関数の中では、save()を誤ってsave()を呼び出す前にvalidate()を呼び出すのを忘れても、ダーティデータがデータベースに表示されないように、保存前にvalidate()を呼び出します。

if($ saveSuccess){
//echo a success message to client or redirect to a success page

その他{
//echo save failed message to client (normally this should not happen unless db server suddenly fails)
}

出口();

これは動作しますが、いくつかの選択肢があるはずです。 例えば、検証のいくつかはセッターで行うことができます。

私は、PHPのモデルにおける検証のためのどのパターンが最も一般的かを知りたいですか?

4 Answer


2


コントローラは検証する必要があります。モデルは信頼できないデータを処理するべきではありません。


2


この方法でモデルを検証することはお勧めしません。

最初に、それがあるべきときに文字列であるべきであり、そうであるべきなときには整数であることを保証する限りにおいて、コントローラに入力を検証させます。 しかし、ビジネスロジックではありません。

新しいメンバーを作成するときは、代わりにすべての情報をコンストラクターを通して渡すことをお勧めします。 このようにしてコンストラクタはOVERALLモデルの一貫性をチェックすることができますが、setterメソッドはそれらが担当する各データの一貫性チェックを持つべきです。

たとえば、firstHeardOfのような別の情報があった場合(メンバーになっているサイトを最初に聞いたとき)、設定者はそれが有効な日付で、誕生日の後であることを確認する必要があります。少なくとも。 これはメソッドの順序付けの問題を引き起こします、そしてメソッドが特定の順序で呼ばれることを要求するのは良い習慣ではありません、その代わりにコンストラクタは呼び出しの順序付けを保証するために使われることができます。

saveメソッドは単純なメソッドになりました。データを保存します。本当に他に責任があるのはなぜでしょう。 せいぜい、構築されたメンバがまだ有効であることを二重チェックしなければなりません。そこで、コンストラクタ検証コードをプライベート/保護された検証メソッドに引き込み、両方の場所でそれを呼び出す必要があります。

少なくとも私の頭の中では、責任と、それがどのようにしてここで分類されるのかについての簡単な説明。

  • コンストラクタは有効な/正しく初期化されたMemberオブジェクトを作成する責任があります。

  • 設定者は、データのメンバオブジェクト内に有効なデータを設定します。

  • saveメソッドは有効なメンバオブジェクトを保存します。


1


これはビジネス検証を実行するための完璧な方法だと思います。 データが無効な場合、あなたの `save()`メソッドはエラーメッセージ付きの文字列を返すかもしれません。そうでなければtrue(冗長な `validate()`呼び出しを保存する)。 これは私が現在行っているアプローチです - それは本当にあなたがどのようにあなたのAPIを設計したいかに依存します。 予測可能で理にかなっている限り。

erenonがコメントしたように、モデルはint、日付フォーマット、悪意のあるコードなどをチェックするような低レベルの検証を実行するべきではありません。 - これらは他の場所に属します(例: Zend_Form)。 ただし、「会員は21歳以上でなければなりません」などの業務検証では問題ありません。


1


検証();空を返します($ this-> errors)。 }

パブリック関数save(){if(!$ this-> isValid()){falseを返す。 }

//保存操作を実行します}}

MemberはModelを継承します

//セッターとゲッターとコンストラクタ

public function validate(){if(empty($ this-> name)){$ this-> errors [] = '名前は空にできません'; }}}

$ member = new Member(array( 'name' => 'Hanse'));

if($ member-> save()){//成功メッセージを表示する} else {//エラーメッセージを表示するprint_r($ member-> getErrors()); }

私は上記のコードと同じアプローチを好みます。 わかりやすく柔軟なAPIを提供します。