实体存在验证在Zend框架2中使用实体中的输入过滤器与原则2



我一直在像这样在实体类中构建我的所有验证......

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(
                                ZendValidatorNotEmpty::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(
                                ZendValidatorNotEmpty::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(
                                ZendValidatorNotEmpty::IS_EMPTY => 'Confirm password can not be empty.' 
                            ),
                        ),
                    ),
                    array(
                        'name' => 'Identical',                        
                        'options' => array(
                            'token' => 'pass',
                            'messages' => array(
                                 ZendValidatorIdentical::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 AuthEntityUser u WHERE u.username = :value';         
         $valid2 = new AuthValidatorDoctrineNoEntityExists($this->getEntityManager(), $query);
         if($valid2->isValid("username")) {
// success
} else {
// failure
}

效果很好。

我如何使用输入过滤器将 NoEntityExists 验证器与我的其他用户名验证器一起使用,如上问题中所述。喜欢这个

    'validators' => array(
                        array(
                          'name' =>'NotEmpty', 
                            'options' => array(
                                'messages' => array(
                                    ZendValidatorNotEmpty::IS_EMPTY => 'User name can not be empty.' 
                                ),
                            ),
                        ),
    array(
    //// no Entity exist validator here
    ),
)

其他参考资料

参考文献1

参考文献2

将 NoEntityExists 验证器放在 User 类中的问题在于,它在实体类和数据存储层之间创建了紧密耦合。这使得在没有 Doctrine 的情况下使用实体类,或者在不重写实体类的情况下切换到新的存储层。这种紧密的耦合是教义特别设计要避免的。

需要检查数据库的验证程序可以保存在自定义的 EntityRepository 类中:

class UserRepository extends DoctrineORMEntityRepository
{
    public function getInputFilter()
    {
        $inputFilter = new ZendInputFilterInputFilter();
        $factory = new ZendInputFilterFactory();
        $inputFilter->add($factory->createInput(array(
            'name' => 'username',
            'validators' => array(
                'name' => 'DoctrineModuleValidatorNoObjectExists',
                'options' => array(
                    'object_repository' => this,
                    'fields' => array('username'),
                ),
            ),
        )));
        return $inputFilter;
    }
}

确保将必要的注释添加到用户实体:

/**
 * @Entity(repositoryClass="MyProjectUserRepository")
 */
class User
{
    //...
}

然后在传递到表单之前将输入筛选器合并在一起:

$request = $this->getRequest();
$entityManager = $this->getServiceLocator()->get('DoctrineORMEntityManager');
$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
}

您是否尝试过将完整的命名空间添加到验证器中?

array(
    'name' =>'AuthValidatorDoctrineNoEntityExists', 
    'options' => array(
        'messages' => array(
           ZendValidatorNotEmpty::IS_EMPTY => 'User name can not be empty.' 
        ),
    ),

),

最新更新