Validation 覆盖/删除Symfony2.5中的服务器端验证

Validation 覆盖/删除Symfony2.5中的服务器端验证,validation,symfony,server-side,Validation,Symfony,Server Side,假设我有以下表单生成器buildForm方法: /** * @param FormBuilderInterface $builder * @param array $options */ public function buildForm(FormBuilderInterface $builder, array $options) { $builder ->add( 'travelTime', 'datetime', arra

假设我有以下表单生成器buildForm方法:

/**
 * @param FormBuilderInterface $builder
 * @param array $options
 */
public function buildForm(FormBuilderInterface $builder, array $options)
{

$builder
    ->add(
        'travelTime',
        'datetime',
        array(
            'label' => 'Time',
            'date_widget' => 'single_text',
            'time_widget' => 'single_text',
            'invalid_message' => 'Please enter a valid date and time',
        )
    )
    ->add(
        'acmeEntity',
        'entity',
        array(
            'label' => 'Acme Entity:',
            'class' => 'AcmeBundle:MyEntity',
            'expanded' => false,
            'multiple' => false,
        )
    )
}
如何覆盖(或删除)对“acmeEntity”表单字段(仅该字段)的验证,以便在调用时:

$form->handleRequest($request);
$form->isValid();
在控制器中,acmeEntity将不包括在确定
$form->isValid()
是否返回true的验证中?我已尝试向字段选项添加
约束=>false
,但收到以下错误消息:

Notice: Trying to get property of non-object in /var/www/vendor/symfony/symfony/src/Symfony/Component/Form/Extension/Validator/Constraints/FormValidator.php line 67
有人知道禁用Symfony表单字段服务器端验证的正确方法吗

编辑:

请注意,我不是在寻找如何完全禁用验证。这可以通过添加以下内容来实现:

    // Disable form validation
    $builder->addEventListener(FormEvents::POST_SUBMIT, function ($event) {
        $event->stopPropagation();
    }, 900); // Always set a higher priority than ValidationListener
到窗体生成器的底部


相反,我想知道如何完全禁用单个表单字段的验证。谢谢大家,祝你们狩猎愉快

我假设您从
MyEntityType
扩展
AbstractType
调用
buildForm()
,因此只需使用选项解析器,在您的类型中添加函数
setDefaultOptions()
,如symphony文档中所述

您可以为您的实体定义一个验证组,并使用
'validation\u groups'=>false
。这应仅禁用此字段的验证

自定义表单类型可能如下所示:

// .../Your/OwnBundle/Form/Type/AcmeEntityType.php
namespace Acme\DemoBundle\Form\Type;

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

class AcmeEntityType extends AbstractType
{
    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'validation_groups' => false
        ));
    }

    public function getParent()
    {
        return 'entity';
    }

    public function getName()
    {
        return 'acme_entity';
    }
}
然后,您可以使用:

$builder
    ->add(
        'travelTime',
        'datetime',
        array(
            'label' => 'Time',
            'date_widget' => 'single_text',
            'time_widget' => 'single_text',
            'invalid_message' => 'Please enter a valid date and time',
        )
    )
    ->add(
        'acmeEntity',
        'acme_entity',
        array(
            'label' => 'Acme Entity:',
            'class' => 'AcmeBundle:MyEntity',
            'expanded' => false,
            'multiple' => false,
        )
    )
}

你可以试试这个,我以前用过:

  • 为MainEntity创建验证组
  • 将此验证组添加到表单中
  • 不要将此验证组添加到AcmeEntity

  • 这不起作用--您必须添加:
    $builder->addEventListener(FormEvents::POST_SUBMIT,函数($event){$event->stopPropagation();},900)”。请注意,我只是在寻找完全禁用单个字段的方法。acmeEntity如何有效或无效?是否要将该选择与acme实体自动保存?我的意思是,在提交表单时,自动将acme实体值与其他映射字段一起保存到数据库中?我使用JavaScript方法以迫在眉睫的截止日期的名义手动更新select选项值,但此解决方案是正确的。谢谢你,先生。如果我能帮点忙,我很高兴。
    
    $builder
        ->add(
            'travelTime',
            'datetime',
            array(
                'label' => 'Time',
                'date_widget' => 'single_text',
                'time_widget' => 'single_text',
                'invalid_message' => 'Please enter a valid date and time',
            )
        )
        ->add(
            'acmeEntity',
            'acme_entity',
            array(
                'label' => 'Acme Entity:',
                'class' => 'AcmeBundle:MyEntity',
                'expanded' => false,
                'multiple' => false,
            )
        )
    }