Symfony2:在字段中附加getter约束错误

时间:2015-11-24 10:13:41

标签: validation symfony symfony-forms symfony-validator

大家好日子!

问题

我无法找到将getter验证错误附加到表单中特定字段的解决方案。

我的实体中有一个方法Presale::hasPresaleProductsAdded()。关于添加到集合

的产品数量,此方法返回true或false

提交表单后,验证错误会冒泡到父表单(因为表单上没有字段" presaleProductsAdded")。我想将此错误附加到" presaleProducts"字段。

我知道error_mapping属性,但我无法正常工作

代码

这是我的validation.yml

OQ\PresaleBundle\Entity\Presale:
    properties:
        name:
            - NotBlank: ~
        description:
            - NotBlank: ~
        company:
            - NotBlank: ~
    getters:
        presaleProductsAdded:
            - "True": { message: "Specify at least one product" }

可能的解决方案

我知道这个问题可以通过自定义验证约束类来解决。 但问题是 - 我是否只能使用validation.yml,实体方法和getter约束

1 个答案:

答案 0 :(得分:2)

所以,我已经明白了。

1)我忘记了error_bubbling选项。 Presale::presaleProducts属性具有在表单中分配的自定义字段类型。该自定义字段类型是复合字段,父类型设置为" form"。在这种情况下,error_bubbling默认为true

切换到假:

class PresaleProductsType extends AbstractType
{
    ... 

    /**
     * @param OptionsResolverInterface $resolver
     */
    public
    function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(
            [
                'data_class' => 'OQ\PresaleBundle\Entity\PresaleProducts',
                'error_bubbling' => false, // That's it!
            ]
        );
    }

    /**
     * @return string
     */
    public
    function getName()
    {
        return 'oq_presale_products';
    }

    /**
     * @return string
     */
    public
    function getParent()
    {
        return 'form';
    }

    ...

}

2)PresaleType表单中的error_mapping选项配置如下:'hasPresaleProductsAdded' => 'presaleProducts'

错误在于属性路径名:sym​​fony没有找到public $hasPresaleProductsAdded;并尝试查找公共getter(或isser或hasser),如:

  • Presale::getHasPresaleProductsAdded()
  • Presale::hasHasPresaleProductsAdded()
  • Presale::isHasPresaleProductsAdded()

但实体类定义中只有Presale::hasPresaleProductsAdded()

所以,我修复了error_mapping选项:

'error_mapping' => array(
    'presaleProductsAdded' => 'presaleProducts', 
),

一切都开始像魅力一样!