4

DoctrineModule\Validator\NoObjectExists編集にも使用される Zend フォームでバリデーターを使用する最も効果的な方法は何ですか? 編集した値を保存するために同じフォームを使用すると、オブジェクトの存在が検証され、フォームが無効になるためです。

4

3 に答える 3

6

数週間前、カスタム フィルターでヘルパー メソッドを使用して同じ問題を解決しました。これが正しいアプローチかどうかはわかりませんが、うまくいきます。

  1. を拡張するカスタム inputfilter を作成します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 ) {
    // ...
}
于 2013-05-29T11:13:55.040 に答える
1

NoObjectExists を簡単な方法で使用することはできません。代わりに UniqueObject を使用する必要があります。

https://github.com/doctrine/DoctrineModule/blob/ea9e6902fd24906250d01d31561454451a788f86/src/DoctrineModule/Validator/UniqueObject.php

于 2014-01-16T17:50:17.110 に答える