当所有其他字段映射到实体时,验证Symfony2表单类中的非映射字段

Kri*_*ris 2 php symfony

我在Symfony2应用程序中有一个主要用于持久化实体的表单,但是我添加了一个额外的非映射字段,用于上载随后处理和删除的文件.但是,我无法弄清楚如何验证这个额外的字段.

这里是buildForm()我的表单类的方法中定义的:

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('name', 'text', array('label' => 'Name'))
        // ...
        ->add('data', 'file', array(
            'label'    => 'CSV Data File',
            'mapped'   => false,
            'required' => false,
        ));
}
Run Code Online (Sandbox Code Playgroud)

我最初尝试将此字段的验证添加到bundle的validation.yml文件中,但是因为此字段不是实体的一部分,所以它抛出了一个错误,说明了这一点.

My\Bundle\Entity\MyEntity:
  properties:
    data:
      - File:
          maxSize: 1024k
          mimeTypes: text/*
          mimeTypesMessage: Please upload a CSV file
Run Code Online (Sandbox Code Playgroud)

我的下一次尝试是在表单类本身中添加约束,就像这样,但看起来你只能以这种方式验证数组,而不是对象,我猜是因为它主要与我的实体绑定.

public function setDefaultOptions(OptionsResolverInterface $resolver)
{
    $collectionConstraint = new Collection(array(
        'data' => new File(array(
            'maxSize'          => '1024k',
            'mimeTypes'        => 'text/*',
            'mimeTypesMessage' => 'Please upload a CSV file',
        )),
    ));

    $resolver->setDefaults(array(
        'data_class'  => 'My\Bundle\Entity\MyEntity',
        'constraints' => $collectionConstraint,
    ));
}
Run Code Online (Sandbox Code Playgroud)

从文档中看,我可以使用$this->get('validator')->validateValue();它自己验证额外字段,但我非常希望立即验证整个表单,并显示与字段本身有关的非映射字段的任何错误.

有没有人有任何想法?

Vad*_*man 8

您只需将property_path = null传递给数据表单字段即可.属性路径用于确定相关实体字段,通过将其值设置为null,您可以告诉表单不向实体提供字段值.

// ...
->add('data', 'file', array(
      'label'         => 'CSV Data File',
      'mapped'        => false,
      'required'      => false,
      'property_path' => null,
));
// ...
Run Code Online (Sandbox Code Playgroud)

UPD:

要验证此字段,请更喜欢创建嵌入式表单并传递数据字段和验证约束:

class dataType extends AbstractType

    // ...

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('data', 'file', array(
            'label'    => 'CSV Data File',
            'required' => false,
        ));
    }

    public function getDefaultOptions(array $options)
    {
        $collection = new Collection(array(
            'data' => new NotBlank(),
            // ...
        ));

        return array(
            'validation_constraint' => $collection,
        );
    }

    //...
Run Code Online (Sandbox Code Playgroud)

并编辑实体表单类:

->add('data', 'file', array(
      'label'         => 'CSV Data File',
      'mapped'        => false,
      'required'      => false,
));
Run Code Online (Sandbox Code Playgroud)

用...来代替:

->add('custom', new DataType(), array(
      'mapped'        => false,
));
Run Code Online (Sandbox Code Playgroud)

  • 为了验证表单的非映射字段,创建自定义表单真的是一个好习惯吗? (4认同)
  • `'mapped'=> false`做同样的事情,但我的问题是如何验证这个字段,而不是如何将它添加到表单而不将它链接到实体. (2认同)