![](/img/trans.png)
[英]Zend Framework & Doctrine 2 findBy using entity returning empty array
[英]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
),
)
其他參考文獻
將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.