本文介绍了如何在编辑表单中使用DoctrineModule\Validator\NoObjectExists - Zend Framework 2&教义2的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在用于编辑的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.


  1. 编写一个定制的输入过滤器,扩展 Zend\ InputFilter\InputFilter

  2. 在过滤器的 init()方法中添加通用过滤器和验证器。

  3. 在输入过滤器中编写一个帮助方法,将原则存在验证器附加到当前的验证器链,如下所示。

  4. 将过滤器实例添加到过滤器实例创建新对象,编辑时使用通用过滤器实例。

  1. Write a custom inputfilter extending Zend\InputFilter\InputFilter.
  2. Add your generic filters and validators at init() method of filter.
  3. Write a helper method in the input filter which appends doctrine's existence validator to current validator chain like below.
  4. 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&amp;教义2的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

10-28 10:58