问题描述
在用于编辑的Zend窗体中使用 DoctrineModule\Validator\NoObjectExists
验证器的最有效方式是什么?因为当我使用相同的表单保存编辑的值时,这将验证对象的存在和标志格式无效。
What is the most effective way to use DoctrineModule\Validator\NoObjectExists
validator in a Zend Form that is used for editing also? Because when I use the same Form for saving edited values, this validates the Object existence and flags form is invalid.
推荐答案
几周之前我在自定义过滤器中使用帮助方法解决了同样的问题。我不知道这是否是正确的方法,但它是有效的。
Few weeks ago I resolved the same problem using a helper method in my custom filter. I am not sure if this is the correct approach but it works.
- 编写一个定制的输入过滤器,扩展
Zend\ InputFilter\InputFilter
。 - 在过滤器的
init()
方法中添加通用过滤器和验证器。 - 在输入过滤器中编写一个帮助方法,将原则存在验证器附加到当前的验证器链,如下所示。
- 将过滤器实例添加到过滤器实例创建新对象,编辑时使用通用过滤器实例。
- Write a custom inputfilter extending
Zend\InputFilter\InputFilter
. - Add your generic filters and validators at
init()
method of filter. - Write a helper method in the input filter which appends doctrine's existence validator to current validator chain like below.
- Add existence validator to your filter instance when creating new object, use generic filter instance when editing.
所以,
<?php
/**
* Baz filter
*/
class BazFilter extends Zend\InputFilter\InputFilter
{
/**
* This method will be triggered automatically when you retrive baz filter via inputfiltermanager.
*/
public function init()
{
// Define your input names, types, validators and filters as arrays
$this->add(array(
'name' => 'code',
'required' => true,
'validators' => array(),
'filters' => array()
));
$this->add( array(...) );
$this->add( array(...) );
// ...
}
/**
* Appends doctrine's noobjectexists validator to validator chain only when required.
*
* @access public
* @param \Doctrine\ORM\EntityRepository $repository
* @return \Zend\InputFilter\InputFilter
*/
public function appendExistenceValidator(\Doctrine\ORM\EntityRepository $repository)
{
$validatorSignature = array(
'name' => 'code',
'validators' => array(
array(
'name' => 'DoctrineModule\Validator\NoObjectExists',
'options' => array(
'object_repository' => $repository,
'fields' => 'code',
'messages' => array( NoObjectExists::ERROR_OBJECT_FOUND => "This object with code already exists in database." )
)
)
)
);
$validator = $this->getFactory()->createInput( $validatorSignature );
$this->add($validator);
return $this;
}
}
最后,在编辑时将此inputfilter附加到您的表单中:
Finally, append this inputfilter to your form when editing:
// $form = your form instance
// $filter = Bazfilter instance
$form->setData($postData)->setInputFilter( $filter );
if( $form->isValid() === false ) {
// ...
}
创建时:
// $filter = bazfilter instance
$repository = $entityManager->getRepository('Your\Entity\Name');
$filter->appendExistenceValidator( $repository ); // <-- Notice this line
$form->setData($postData)->setInputFilter( $filter );
if( $form->isValid() === false ) {
// ...
}
这篇关于如何在编辑表单中使用DoctrineModule\Validator\NoObjectExists - Zend Framework 2&教义2的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!