【问题标题】:Validating a non-mapped field in a Symfony2 form class when all other fields are mapped to an entity当所有其他字段都映射到实体时,验证 Symfony2 表单类中的非映射字段
【发布时间】:2012-10-25 15:20:40
【问题描述】:

我的 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,
        ));
}

我最初尝试像这样将该字段的验证添加到捆绑包的 validation.yml 文件中,但由于该字段不是实体的一部分,因此会抛出一个错误。

My\Bundle\Entity\MyEntity:
  properties:
    data:
      - File:
          maxSize: 1024k
          mimeTypes: text/*
          mimeTypesMessage: Please upload a CSV file

我的下一个尝试是在表单类本身中添加约束,就像这样,但您似乎只能以这种方式验证数组,而不是对象,我猜这是因为它主要与我的实体相关联。

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,
    ));
}

从文档看来,我可以使用 $this->get('validator')->validateValue(); 自行验证额外字段,但我很想一次验证整个表单并显示与非映射字段相关的任何错误字段本身。

有人有什么想法吗?

【问题讨论】:

    标签: php symfony


    【解决方案1】:

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

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

    UPD:

    要验证此字段 id,最好创建嵌入式表单并传递数据字段和验证约束:

    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,
            );
        }
    
        //...
    

    并编辑实体表单类:

    ->add('data', 'file', array(
          'label'         => 'CSV Data File',
          'mapped'        => false,
          'required'      => false,
    ));
    

    替换为:

    ->add('custom', new DataType(), array(
          'mapped'        => false,
    ));
    

    【讨论】:

    • 'mapped' => false 做同样的事情,但我的问题是如何验证这个字段,而不是如何在不将其链接到实体的情况下将其添加到表单中。
    • 嗯,你是对的。我有解决方案,让我更新我的答案
    • 创建自定义表单只是为了验证表单的非映射字段真的是一个好习惯吗?
    猜你喜欢
    • 2012-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-21
    • 1970-01-01
    • 2015-04-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多