【问题标题】:Symfony2: append getter constraint error to the fieldSymfony2:将getter约束错误附加到字段
【发布时间】:2016-02-26 17:28:53
【问题描述】:

大家好!

问题

我找不到将 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约束来做吗

【问题讨论】:

    标签: validation symfony symfony-forms symfony-validator


    【解决方案1】:

    所以,我明白了。

    1) 我忘记了error_bubbling 选项。 Presale::presaleProducts 属性具有在表单中分配的自定义字段类型。该自定义字段类型是复合字段,父类型设置为“表单”。在这种情况下,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'

    错误出在属性路径名中:symfony 没有找到public $hasPresaleProductsAdded; 并试图找到 public getter (or isser or hasser) like:

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

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

    所以,我修复了 error_mapping 选项:

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

    一切都开始像魅力一样开始运作!

    【讨论】:

      猜你喜欢
      • 2016-04-05
      • 1970-01-01
      • 1970-01-01
      • 2013-02-08
      • 1970-01-01
      • 2012-08-28
      • 2014-05-26
      • 2023-03-06
      • 1970-01-01
      相关资源
      最近更新 更多