2012-10-05 8 views
5

私はこのようなエンティティクラスの私のすべての検証を構築してきた中でエンティティは...実体

class User 
{ 
    protected $inputFilter; 

    public function getInputFilter() 
    { 
     if (!$this->inputFilter) { 
      $inputFilter = new InputFilter(); 

      $factory = new InputFactory(); 


      $inputFilter->add($factory->createInput(array(
       'name' => 'username', 
       'required' => true, 
       'filters' => array(
        array('name' => 'StripTags'), 
        array('name' => 'StringTrim'), 
       ), 
       'validators' => array(
        array(
         'name' =>'NotEmpty', 
         'options' => array(
          'messages' => array(
           \Zend\Validator\NotEmpty::IS_EMPTY => 'User name can not be empty.' 
          ), 
         ), 
        ), 
        array(
         'name' => 'StringLength', 
         'options' => array(
          'encoding' => 'UTF-8', 
          'min' => 4, 
          'max' => 20, 
          'messages' => array(
           'stringLengthTooShort' => 'Please enter User Name between 4 to 20 character!', 
           'stringLengthTooLong' => 'Please enter User Name between 4 to 20 character!' 
          ), 
         ), 
        ), 
       ), 
      ))); 


      $inputFilter->add($factory->createInput(array(
       'name' => 'pass', 
       'required' => true, 
       'filters' => array(
        array('name' => 'StripTags'), 
        array('name' => 'StringTrim'), 
       ), 
       'validators' => array(
        array(
         'name' =>'NotEmpty', 
         'options' => array(
          'messages' => array(
           \Zend\Validator\NotEmpty::IS_EMPTY => 'Password can not be empty.' 
          ), 
         ), 
        ), 
        array(
         'name' => 'StringLength', 
         'options' => array(
          'encoding' => 'UTF-8', 
          'min' => 4, 
          'max' => 20, 
          'messages' => array(
           'stringLengthTooShort' => 'Please enter Password between 4 to 20 character!', 
           'stringLengthTooLong' => 'Please enter Password between 4 to 20 character!' 
          ), 
         ), 
        ), 
       ), 
      )));    



      $inputFilter->add($factory->createInput(array(
       'name' => 'confPass',     
       'required' => true, 
       'filters' => array(
        array('name' => 'StripTags'), 
        array('name' => 'StringTrim'), 
       ), 
       'validators' => array(
        array(
         'name' =>'NotEmpty', 
         'options' => array(
          'messages' => array(
           \Zend\Validator\NotEmpty::IS_EMPTY => 'Confirm password can not be empty.' 
          ), 
         ), 
        ), 
        array(
         'name' => 'Identical',       
         'options' => array(
          'token' => 'pass', 
          'messages' => array(
           \Zend\Validator\Identical::NOT_SAME => 'Confirm password does not match!'       ), 
         ), 
        ), 
       ), 
      )));    


      $this->inputFilter = $inputFilter; 
     } 

     return $this->inputFilter; 
    } 
} 

をinputfilter使用して、私のユーザーのコントローラでそれを呼び出す教義2でZend Frameworkの2の検証を存在します。

$request = $this->getRequest(); 
     $user = new User(); 
     $form = new Loginform(); 
     $form->setInputFilter($user->getInputFilter()); 
     $form->setData($request->getPost()); 
     if ($form->isvalid()) { 
     // success 
     } else { 
     // fail 
     } 

正常に動作しています。しかし、今私は、ユーザエンティティがすでに私がバリデータを作成したダニエルのthis example

以下でそう をデータベースに存在しているか否かをチェックし、それをこのように私のユーザーのコントローラをテストする必要があるシナリオを持っています。

 $query = 'SELECT u FROM Auth\Entity\User u WHERE u.username = :value';   
     $valid2 = new \Auth\Validator\Doctrine\NoEntityExists($this->getEntityManager(), $query); 
     if($valid2->isValid("username")) { 
// success 
} else { 
// failure 
} 

正常に機能しました。

この質問で上記のようにinputfilterを使用している他のユーザー名検証ツールでNoEntityExists validtorを使用するにはどうすればよいですか。

'validators' => array(
         array(
          'name' =>'NotEmpty', 
          'options' => array(
           'messages' => array(
            \Zend\Validator\NotEmpty::IS_EMPTY => 'User name can not be empty.' 
           ), 
          ), 
         ), 
    array(

    //// no Entity exist validator here 
    ), 

) 

このような他の参考文献

ref1

ref2

答えて

7

自分のUserクラスにNoEntityExistsバリデータを置くことの問題点は、エンティティクラスとデータ記憶層との間に緊密な結合を作成することです。 Doctrineなしでエンティティクラスを使用することや、エンティティクラスを書き換えずに新しいストレージレイヤに切り替えることは不可能です。この密結合は、Doctrineが避けるように特別に設計されたものです。データベースをチェックする必要があり

バリデータは、カスタムEntityRepositoryクラスで保持することができます。

class UserRepository extends \Doctrine\ORM\EntityRepository 
{ 
    public function getInputFilter() 
    { 
     $inputFilter = new \Zend\InputFilter\InputFilter(); 
     $factory = new \Zend\InputFilter\Factory(); 

     $inputFilter->add($factory->createInput(array(
      'name' => 'username', 
      'validators' => array(
       'name' => '\DoctrineModule\Validator\NoObjectExists', 
       'options' => array(
        'object_repository' => this, 
        'fields' => array('username'), 
       ), 
      ), 
     ))); 

     return $inputFilter; 
    } 
} 

は、ユーザーエンティティに必要な注釈を追加してください:

/** 
* @Entity(repositoryClass="MyProject\UserRepository") 
*/ 
class User 
{ 
    //... 
} 

が次に入力をマージあなたのフォームに渡す前にフィルタリングしてください:

$request = $this->getRequest(); 
$entityManager = $this->getServiceLocator()->get('Doctrine\ORM\EntityManager'); 
$repository = $entityManager->getRepository('User'); 
$user = new User(); 

$filter = $repository->getInputFilter(); 
$filter->add($user->getInputFilter()); 
$form = new Loginform(); 
$form->setInputFilter($filter); 
$form->setData($request->getPost()); 

if ($form->isValid()) { 
    // success 
} else { 
    // fail 
} 
-3

あなたは検証に完全な名前空間を追加しようとしたことがありますか?

array(
    'name' =>'\Auth\Validator\Doctrine\NoEntityExists', 
    'options' => array(
     'messages' => array(
      \Zend\Validator\NotEmpty::IS_EMPTY => 'User name can not be empty.' 
     ), 
    ), 

)、

関連する問題