如何验证Symfony 2中至少一个元素(或N个元素)的选择?

gre*_*emo 7 symfony-forms symfony doctrine-orm

我的表单作为字段users(实体类型).如何添加验证以便至少应选择一个用户?实际上我正在添加一个事件监听器,但我不知道这是否是一个合法的解决方案:

public function buildForm(\Symfony\Component\Form\FormBuilder $builder,
    array $options)
{
    $builder
        ->add('title', 'text', array(
            'label' => 'Titolo'
        ))
        ->add('content',  'textarea', array(
            'label' => 'Contenuto'
        ))
        ->add('sender_text',  'text', array(
            'label' => 'Mittente testuale',
        ))
        ->add('users', 'entity', array(
            'label'    => 'Destinatari',
            'class'    => 'DL\FidelityBundle\Entity\User',
            'property' => 'select_label',
            'multiple' => true
        ));
    ;

    // Valida il numero di utenti selezionati
    $builder->addEventListener(\Symfony\Component\Form\FormEvents::POST_BIND,
        function($event) {
            $form = $event->getForm();
            $data = $event->getData();

            if(!$data->users->isEmpty()) return;

            $msg = 'Occorre specificare almeno un utente destinatario';
            $form->get('users')->addError(new FormError($msg));
    });
}
Run Code Online (Sandbox Code Playgroud)

Ber*_*sek 20

从Symfony 2.1开始,您可以使用Count约束.如果您使用的是2.0,则只需将约束复制到项目中并调整其名称空间及其API(在2.0和2.1之间略有变化).

/**
 * @Assert\Count(min = 1, minMessage = "Occorre specificare almeno un utente destinatario") 
 */
private $users = new ArrayCollection();
Run Code Online (Sandbox Code Playgroud)


gno*_*lak 5

您是否尝试过使用Count约束验证器?我想你的代码看起来像这样:

->add('users', 'entity', array(
        'label'    => 'Destinatari',
        'class'    => 'DL\FidelityBundle\Entity\User',
        'property' => 'select_label',
        'multiple' => true,
        'constraints' => new Count(
            array('min' => 1, 'minMessage' => "Please select at least one user')
        ),
    ));
Run Code Online (Sandbox Code Playgroud)


Sgo*_*kes -1

查看验证组件:http://symfony.com/doc/current/book/validation.html

您可以在要验证的对象中编写回调约束:

use Symfony\Component\Validator\ExecutionContext;

public function isUsersValid(ExecutionContext $context)
{
    if ($this->users->isEmpty()) {
        $propertyPath = $context->getPropertyPath() . '.users';
        $context->setPropertyPath($propertyPath);
        $context->addViolation('Occorre specificare almeno un utente destinatario', array(), null);
    }
}
Run Code Online (Sandbox Code Playgroud)

请参阅回调约束页面,了解如何将此约束添加到您的实体(这取决于您是否使用注释或 yaml/xml)。