DoctrineModule\Validator\NoObjectExists
編集にも使用される Zend フォームでバリデーターを使用する最も効果的な方法は何ですか? 編集した値を保存するために同じフォームを使用すると、オブジェクトの存在が検証され、フォームが無効になるためです。
4889 次
3 に答える
6
数週間前、カスタム フィルターでヘルパー メソッドを使用して同じ問題を解決しました。これが正しいアプローチかどうかはわかりませんが、うまくいきます。
- を拡張するカスタム inputfilter を作成します
Zend\InputFilter\InputFilter
。 init()
フィルターのメソッドで汎用フィルターとバリデーターを追加します。- 以下のように、Doctrine の存在バリデーターを現在のバリデーター チェーンに追加するヘルパー メソッドを入力フィルターに記述します。
- 新しいオブジェクトを作成するときにフィルタ インスタンスに存在バリデータを追加し、編集するときに汎用フィルタ インスタンスを使用します。
そう、
<?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 を使用する必要があります。
于 2014-01-16T17:50:17.110 に答える