Я строю всю свою проверку в классе Entity, как это …
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; } }
и называя его в моем пользовательском контроллере.
$request = $this->getRequest(); $user = new User(); $form = new Loginform(); $form->setInputFilter($user->getInputFilter()); $form->setData($request->getPost()); if ($form->isvalid()) { // success } else { // fail }
он работает нормально. но теперь у меня есть сценарий, где я должен проверить, существует ли пользовательская сущность в базе данных или нет. Следуя приведенному ниже примеру Даниила
Я создал валидатор и проверил его как пользовательский контроллер.
$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 }
который работал нормально.
Как я могу использовать валидатор NoEntityExists с моими другими валидаторами имени, используя inputfilter, как указано выше в этом вопросе. как это
'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
Проблема с установкой валидатора NoEntityExists в вашем классе User заключается в том, что он создает плотную связь между классом сущности и уровнем хранения данных. Это делает невозможным использование класса сущности без 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 }
Вы пытались добавить полное пространство имен в Validator?
array( 'name' =>'\Auth\Validator\Doctrine\NoEntityExists', 'options' => array( 'messages' => array( \Zend\Validator\NotEmpty::IS_EMPTY => 'User name can not be empty.' ), ),
),