php - 如何根据用户在 symfony2 中提交的数据进行条件表单验证?

标签 php forms symfony symfony-forms

这是我的设置实体表单,

class SettingType extends AbstractType
{

    /**
     * @param FormBuilderInterface $builder
     * @param array $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('key')
            ->add('values', 'collection', array(
                'allow_add' => true,
                'allow_delete' => true,
            ))
            ->add('parent')
            ->add('settingCategory')
            ->add('user')
            ->add('settingOption')
        ;


        $builder->addEventListener(FormEvents::POST_SUBMIT, function (FormEvent $event) {

            $setting = $event->getData();

            if ($parent = $setting->getParent()) {
                $setting->setKey($parent->getKey());
                $setting->setSettingCategory($parent->getSettingCategory());
                $event->setData($setting);
            }
        });
    }

    /**
     * @param OptionsResolverInterface $resolver
     */
    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'Acme\SettingBundle\Entity\Setting',
            'csrf_protection' => false
        ));
    }

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

我正在使用 REST POST 请求提交表单数据。例如对于默认应用程序设置,

{
    "setting" : 
    {
        "key": "setting1", 
        "values": ["setting1va1", "setting1va2"],
        "settingCategory": 1
    }
}

现在覆盖此设置以供用户选择不同的值

{
    "setting" : 
    {
        "values": ["setting1va1"],
        "user":44319,
        "parent": 1
    }
}

所以这里正如您在表单中看到的那样,如果设置了 parent,则 key 和 settingCategory 是从父设置对象继承的。

如果 parent 为 NULL,我希望“key”和“settingCategory”是必需的(非空白),但如果设置了 parent,则“key”和“settingCategory”不是必填字段。

如何在 symfony 中做到这一点?

最佳答案

我建议你使用 callback validator

例如,在您的实体类中:

<?php

use Symfony\Component\Validator\Constraints as Assert;

/**
 * @Assert\Callback(methods={"validateParent"})
 */
class Setting {



    public function validateParent(ExecutionContextInterface $context)
    {
        if (
                $this->getParent() // NOT NULL
                &&
                ( // ONE OF THIS IS BLANK
                    ($parent->getSettingCategory() && trim($parent->getSettingCategory()==''))
                        ||
                    ($parent->getKey() && trim($parent->getKey()==''))
                )
            )
        {
            $context->addViolation('mandatory params');
        }
    }
}

否则,您可以按照 here 所述构建自己的自定义验证器.

让我知道您需要更多信息。

希望对你有帮助

关于php - 如何根据用户在 symfony2 中提交的数据进行条件表单验证?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30069575/

相关文章:

php - Laravel 4 - 如何插入多个模型?

php - == 运算符在 PHP 中是可传递的吗?

css - Materialize:以 % 设置的 translateY 转换在 Safari 中不稳定

php - Symfony 2.8 文件上传 "Cannot read index ".. ."from object of type because Entity doesn' t 实现 ArrayAccess。”

php - Symfony 从 Controller 设置 block 内容

php - Behat/mink/laravel 中缺少扩展名

php - "Adaptive Server is unavailable or does not exist"从 PHP 连接到 SQL Server 时出错

c# - 无法在 .Net (C#) 中使用 ajax 发送基本的非 MVC 表单

security - Silex/Symfony2 记住我身份验证用户界面 RedBean 包装器

symfony - {"error":"invalid_client","error_description":"The client credentials are invalid"} 在 fosauth 包中