【问题标题】:Symfony constraint error is not located where it shouldSymfony 约束错误不在应有的位置
【发布时间】:2017-07-07 08:56:16
【问题描述】:

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

  • AddressFieldsType,处理邮政编码等地址字段。
  • 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]: 地址[地址字段][邮编]:

我明白了:

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

问题:

使用此代码:

// 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]: 地址[地址字段][邮编]:

我明白了:

->不正确,约束错误在表单之上

当然:

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

【问题讨论】:

    标签: php forms validation annotations symfony


    【解决方案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) }}
    

    无论如何,您的问题一定出在模板的格式上。

    【讨论】:

    • 感谢您的帮助,但很抱歉这不起作用(属性“zipCode”或“zipCode()”、“getzipCode()”/“iszipCode()”或“__call”方法之一()" 存在并且在类 "Symfony\Component\Form\FormView" 中具有公共访问权限)。
    • 能否提供您的模板?
    • 可能是 form.addressFields[0].zipCode ?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-22
    • 2018-11-18
    • 2015-09-12
    • 1970-01-01
    • 2011-10-04
    • 2019-02-04
    相关资源
    最近更新 更多