4

'property_path' => false を使用して追加のバインドされていないフィールドが追加されたフォームがあります。

このフィールドで簡単な検証を行いたいのですが、次のようなものを使用することを提案する多くの回答が見つかりました

$builder->addValidator(...);

しかし、symfony 2.1 では $builder->addValidator が非推奨になっていることがわかりました。Symfony 2.1 でバインドされていないフィールドに検証を行う正​​しい方法を知っている人はいますか?

4

2 に答える 2

5

編集 :

トピックSymfony validate form with maps false form fieldsに関するより完全な回答を作成しました

元の答え

フォーム内のバインドされていない (マップされていない) フィールドの検証は十分に文書化されておらず、急速に進化しているフォームとバリデーター コンポーネントにより、いくつかの例が廃止されています (Symfony 2.1.2 の場合)。

今のところ、イベントリスナーを使用して、検証済みのマップされていないフィールドで成功しています。ここに私の簡略化されたコードがあります:

namespace Dj\TestBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;

use Symfony\Component\Form\FormEvents;
use Dj\TestBundle\Form\EventListener\NewPostListener;

class PostType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('lineNumber', 'choice', array(
                        'label' => 'How many lines :',
                        'choices' => array(
                            3 => '3 lines',
                            6 => '6 lines'
                        ),
                        // 'data' => 3, // default value
                        'expanded' => true,
                        'mapped' => false
                    ))
                ->add('body', 'textarea', array(
                        'label' => 'Your text',
                        'max_length' => 120));

        // this listener will validate form datas
        $listener = new NewPostListener;
        $builder->addEventListener(FormEvents::POST_BIND, array($listener, 'postBind'));
    }

    // ... other methods
}

そしてイベントリスナー:

namespace Dj\TestBundle\Form\EventListener;

use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\FormError;

/**
 * listener used at Post creation time to validate non mapped fields
 */
class NewPostListener
{

    /**
     * Validates lineNumber and body length
     * @param \Symfony\Component\Form\FormEvent $event
     */
    public function postBind(FormEvent $event)
    {
        $form = $event->getForm();
        $data = $event->getData();

        if (!isset($data->lineNumber)) {
            $msg = 'Please give a correct line number';
            $form->get('lineNumber')->addError(new FormError($msg));
        }
        
        // ... other validations

    }
}

これは、バリデーターでこれを行う方法がわかるまで、マップされていないフィールドを検証する方法です。

于 2012-10-25T15:54:21.980 に答える
0

私はこれを得るドキュメントから同じ問題を抱えています:

インターフェース FormValidatorInterface は廃止され、Symfony 2.3 で削除されます。このインターフェイスを使用してカスタム バリデータを実装した場合は、FormEvents::POST_BIND (またはその他の *BIND イベント) をリッスンするイベント リスナに置き換えることができます。CallbackValidator クラスを使用した場合は、コールバックを addEventListener に直接渡す必要があります。

これはイベントリスナーを使用することを提案していますが、例が見つかりませんでした。

https://github.com/symfony/symfony/blob/master/UPGRADE-2.1.md

于 2012-10-22T10:50:44.713 に答える