【问题标题】:FOSUserBundle : one of two fields mandatoryFOSUserBundle :必填的两个字段之一
【发布时间】:2013-12-27 13:25:05
【问题描述】:

我在 Symfony2 中使用 FOSUserBundle,我希望用户在家庭电话号码和手机号码之间输入至少一个电话号码,但我找不到在哪里添加至少一个支票字段已填写。

有什么线索吗? 谢谢

【问题讨论】:

    标签: symfony fosuserbundle


    【解决方案1】:

    你可以让自己成为一个类约束。在custom constraints 上查看 Symfony 的食谱部分。在底部有一小部分关于类约束验证器。

    你会有这样的约束:

    class RegistrationPhones extends Constraint
    {
        public $message = '';
    
        public function getTargets()
        {
            return self::CLASS_CONSTRAINT;
        }
    
        public function validatedBy()
        {
            return 'user_phones_validator';
        }
    }
    

    那么您的验证器将如下所示:

    class RegistrationPhonesValidator extends ConstraintValidator
    {
        public function validate($registration, Constraint $constraint)
        {
            $homePhone = $registration->getHomePhone();
            $mobilePhone = $registration->getMobilePhone();
            if (empty($homePhone) && empty($mobilePhone)) {
                $this->context->addViolationAt('homePhone', $constraint->message, array(), null);
            }
        }
    }
    

    最后,你的 validation.yml 会有这样的条目:

    User\MyBundle\Form\Model\Registration:
        constraints:
            - User\MyBundle\Validator\Constraints\RegistrationPhonesValidator:
                message: phones.at_least_one_must_be_set
    

    这应该可以解决问题。

    【讨论】:

    • 不错的答案。我会建议创建PhoneNnumber 实体的集合并使用Count (min=1) 和Collection (NotBlank + allowMissingFields=true) 的组合来验证该集合。例如,当添加更多类型的电话号码时,这将更容易维护。
    • @nifr 你是对的。我自己考虑过,但决定给出这个答案,以了解如何在您想要确保 2 个字段中的 1 个不为空的一般情况下进行操作。但你是对的。对于电话号码,更容易想象电话号码的集合。
    猜你喜欢
    • 2021-10-09
    • 2015-03-08
    • 1970-01-01
    • 2018-06-08
    • 1970-01-01
    • 2021-10-02
    • 2011-01-11
    • 2014-08-15
    • 1970-01-01
    相关资源
    最近更新 更多