1

モデルとモデルマッパーがある次の状況では、たとえば次のような検証関数をどこに配置すればよいかについて少し戸惑います。

models
-> User
-> UserMapper

Class User{

  private $id;
  private $name;
  private $email;

  }

Class UserMapper extends Zend_Db_Table_Abstract{

  function findById($id){
  }

  function save(User $user){
  }

}

新しいユーザーオブジェクトが既存のユーザーオブジェクトと同じ電子メールを持つことができないように設定する必要があります-これをチェックするための検証ロジックをどこに配置しますか?つまり、モデルまたはモデルマッパーで?それは次のようになりますか?

Class UserController{

  function doAction(){
    $user = new User();
    $u = new UserMapper();
    ...
    // is this the right way to do this?
    if($user->validate()){

    }

    // or is this the right way to do this?

   if($u->validate($user)){

   }

}
}
4

2 に答える 2

2

この検証は登録フォームで行われることがよくあります。登録フォーム オブジェクトを使用して検証を行うことも、User オブジェクトを使用することもできます。

いずれにせよZend_Validate::DbNoRecordExists、またはZend_Validate::DbRecordExists有用であることが証明され、フォームバリデーターとして使用できます。

//form demo
class Reg_Form extends Zend_Form
{  
public function init() {
   $name = new Zend_Form_Element_Text('name');
        $name->setLabel('Name');
        $name->setAttrib('placeholder', 'Username');
        $name->setOptions(array('size' => 20));
        $name->addFilter('StringToLower');
        //truncated for brevity
        $name->addValidator(new Zend_Validate_Db_NoRecordExists(array(
                    'table' => 'users',
                    'field' => 'name'
                )));
        $this->addElement($name);
    }
}

またはモデル内のスタンドアロンのバリデーター。

//Entity Model demo, This is used to check against MP3 database
/**
 * Does record already exist in DB
 *
 * Pass in the mapper to use as a string.
 * Will trigger predefined validator DbNoRecordExists
 *
 * @param string $mapper accepted values are: 'album' 'artist' 'track'
 * @return boolean returns true if no record exists
 */
protected function dbNoExist($mapper)
{
    switch ($mapper) {
        case 'album':
            $value = $this->taginfo->getAlbum();
            $options = array(
                'table'  => 'album',
                'field'  => 'title'
            );
            break;
        case 'artist':
            $value = $this->taginfo->getArtist();
            $options = array(
                'table'  => 'artist',
                'field'  => 'name'
            );
            break;
        case 'track':
            $value = $this->taginfo->getMd5();
            $options = array(
                'table' => 'track',
                'field' => 'hash'
            );
    }
    $validator = new Zend_Validate_Db_NoRecordExists($options);
    if ($validator->isValid($value)) {
        //no record exists
        return TRUE;
    } else {
        //record exists
        return FALSE;
    }
}

私のプロジェクトでこれらの質問に答えようとする方法は次のとおりです。

データの永続性を MySql からフラット ファイル (またはその他の方法) に変更した場合でも、このアクション (検証) を実行する必要がありますか?

その場合、コードはエンティティ モデル (ユーザー) に入ります。そうでない場合、コードはマッパーに入ります。これはちょっと単純すぎると思いますが、通常は正しい方向に進むことができます。

[編集]

個人的には、可能であればフォームが投稿される前に、この小さな検証を行うつもりです。ユーザーがフォームを投稿する前に、その電子メールでアカウントを既に持っているかどうかをユーザーに知らせたいので、時間とフラストレーションの両方を節約できます。最終的な検証は常にユーザー モデルで行うことができます。

幸運を。

于 2012-12-22T09:59:31.217 に答える
1

データベーステーブルに関連する複雑なロジックまたは検証は、「model」クラス(User)に移動する必要があります。それらをTableクラス(UserMapper)内に配置しないでください。

あなたの場合、モデルクラス名は'User'です。

重複する電子メールチェックについては、以下のアプローチに従います。

  1. 'Model Mapper'ファイル(UserMapper.php)をモデルファイル(User.php)にインクルードします
  2. Modelクラス(User)内に「isEmailDuplicate($ emailAddress)」という名前のパブリックSTATICメソッドを作成します。この関数内で、Mapperクラス(UserMapper.php)のオブジェクトを作成し、Mapperクラスオブジェクト(UserMapper.php)に対して「Zend_Db_select」(ヘルプリンク)を使用して選択クエリを実行します。最後に、ブール結果を呼び出し元に返します。
  3. UserControllerからModel関数を呼び出します。$ isEmailDuplicate = User :: isEmailDuplicate($ emailAddress);
于 2012-12-22T08:40:02.097 に答える