Symfony约束错误不在它应该的位置

时间:2017-02-17 18:00:53

标签: php forms validation annotations symfony

我有一个'复杂'的symfony表单,让用户可以在现有地址之间进行选择或填写新地址。有3种表单类型:

  • AddressFieldsType,用于处理zipCode等地址字段
  • AddressIdType,允许用户通过输入其ID来选择数据库中的现有地址。是的,这不是用户友好的。是的,这只是出于解释的原因,在实际案例中,我有一个选择。
  • 结合两种形式的AddressType

AddressType应该从/到地址获取/设置,但是它自己的表单描述与数据不匹配,因此有data transformer将地址转换为例外数据数组格式。

我做了一个完整的symfony项目来解释这个问题: https://github.com/ruben-podadera/tmp-sf-form-issue

没问题:

使用此代码:

// src/AppBundle/Entity/Address.php
...    
class Address
{
    public $id;

    public $zipCode;
}

// src/AppBundle/Form/AddressFieldsType.php
...
class AddressFieldsType extends AbstractType{

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('zipCode', TextType::class, [
                'constraints' => [new NotBlank()]
            ]);
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'data_class' => Address::class
        ]);
    }
}

我提交空数据:     地址[ADDRESS_ID]:     地址[address_fields] [邮编]:

我明白了:

- >这是正确的,约束错误位于导致错误的字段旁边

问题:

使用此代码:

// src/AppBundle/Entity/Address.php
...
use Symfony\Component\Validator\Constraints as Assert;

class Address
{
    public $id;

    /**
     * @Assert\NotBlank()
     */
    public $zipCode;
}

// src/AppBundle/Form/AddressFieldsType.php
...
class AddressFieldsType extends AbstractType{

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('zipCode', TextType::class);
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'data_class' => Address::class
        ]);
    }
}

我提交空数据:     地址[ADDRESS_ID]:     地址[address_fields] [邮编]:

我明白了:

- >不正确,约束错误位于表单

之上

当然:

在实际项目中,我必须使用带注释的约束,因为它们被其他形式使用。

1 个答案:

答案 0 :(得分:1)

您可以像这样手动格式化表单行:

<div>
    {{ form_label(form.zipCode) }}
    {{ form_errors(form.zipCode) }} {# This field will show the error if any #}
    {{ form_widget(form.zipCode) }}
</div>

或者这样:

{{ form_row(form.zipCode) }}

无论如何,您的问题必须在模板的格式化中。