2012-10-05 17 views
5

he estado construyendo mi toda la validación en la clase de entidad como esta ...Entidad existe la validación de Zend Framework 2 con 2 Doctrina usando inputfilter en la entidad

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; 
    } 
} 

y decir que es en mi controlador de usuario.

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

ha estado funcionando bien. pero ahora tengo un escenario en el que tengo que comprobar si la entidad de usuario ya existe en la base de datos o no Así, siguiendo this example

de Daniel creé un validador y probarlo mi regulador de usuario como este.

 $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 
} 

que funcionó bien.

¿Cómo puedo usar el validador NoEntityExists con mis otros validadores de nombre de usuario usando inputfilter como se indica anteriormente en esta pregunta? como esto

'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 
    ), 

) 

Otras referencias

ref1

ref2

Respuesta

7

El problema con poner el validador NoEntityExists en su clase de usuario es que crea una estrecha conexión entre la clase de entidad y la capa de almacenamiento de datos. Impide el uso de la clase de entidad sin Doctrine, o para cambiar a una nueva capa de almacenamiento sin reescribir la clase de entidad. Este estrecho acoplamiento es lo que Doctrine está específicamente diseñado para evitar.

validadores que necesita comprobar la base de datos se puede mantener en una clase EntityRepository personalizado:

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; 
    } 
} 

Asegúrese de añadir la anotación necesaria para su entidad Usuario:

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

luego fusionar la entrada filtros juntos antes de pasar a su formulario:

$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

¿Usted ha intentado añadir el espacio de nombres completo al Validador?

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

),

Cuestiones relacionadas