簡體   English   中英

實體在Zend Framework 2中使用Doctrine 2在實體中使用inputfilter進行驗證

[英]Entity exist validation in Zend Framework 2 with Doctrine 2 using inputfilter in entity

我一直在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
         }

它一直很好。 但現在我有一個場景,我必須檢查用戶實體是否已經存在於數據庫中所以請遵循Daniel的這個例子

我創建了一個驗證器並像這樣測試我的用戶控制器。

        $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驗證器與我的其他用戶名驗證器一起使用。 像這樣

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

確保向User實體添加必要的注釋:

/**
 * @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.' 
        ),
    ),

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM