php - 如何在编辑表单中使用 DoctrineModule\Validator\NoObjectExists - Zend Framework 2 & Doctrine 2

标签 php validation doctrine-orm zend-framework2 zend-form

在用于编辑的 Zend Form 中使用 DoctrineModule\Validator\NoObjectExists 验证器的最有效方法是什么?因为当我使用相同的表单来保存编辑后的值时,这会验证对象的存在并标记表单无效。

最佳答案

几周前,我在自定义过滤器中使用辅助方法解决了同样的问题。我不确定这是否是正确的方法,但它有效。

  1. 编写一个扩展 Zend\InputFilter\InputFilter 的自定义输入过滤器。
  2. 在过滤器的 init() 方法中添加您的通用过滤器和验证器。
  3. 在输入过滤器中编写一个辅助方法,将 doctrine 的存在验证器附加到当前验证器链,如下所示。
  4. 在创建新对象时将存在验证器添加到您的过滤器实例,在编辑时使用通用过滤器实例。

所以,

<?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 附加到您的表单:

// $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 ) {
    // ...
}

关于php - 如何在编辑表单中使用 DoctrineModule\Validator\NoObjectExists - Zend Framework 2 & Doctrine 2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16808574/

相关文章:

javascript - 以 9Gag 风格显示 GIF 图像

javascript - 如何检查输入的值是 react js中的数字还是字符串?

javascript - 推荐的解决方案让 AngularJS 识别浏览器已检测到的无效输入?

orm - Symfony2 - 学说 :create in Production

symfony - 如何修复 Gedmo sortable 中的 "This repository can be attached only to ORM sortable listener"错误?

php - Stream_get_contents 第二次不起作用?

磁盘上的 PHP 输出文件到浏览器

javascript - Angularjs 使用外部变量验证字段更改的表单

php - 当 mysql 中存在 unicode 字符时,无法将条目存储为字符串

php - 将 jQuery setInterval 计时转换为递归 setTimeout 计时