gpt4 book ai didi

php - Zend Framework 2 中的实体存在验证和 Doctrine 2 在实体中使用 inputfilter

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:39:15 25 4
gpt4 key购买 nike

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

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

并在我的用户 Controller 中调用它。

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

它一直运行良好。但现在我有一个场景,我必须检查用户实体是否已经存在于数据库中所以通过关注 Daniel 的 this example

我创建了一个验证器并像这样在我的用户 Controller 上测试它。

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

关于php - Zend Framework 2 中的实体存在验证和 Doctrine 2 在实体中使用 inputfilter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12747638/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com