在验证Symfony2表单期间访问所有表单域

时间:2016-03-21 12:01:46

标签: php forms validation symfony

考虑以下形式:

protocol BoxDelegate: class {
    associatedtype T
    func valueInBoxChanged(box: Box<T>) -> Void
}

class Box<T> {

    var notifyClosure: (Void -> Void)?

    var boxedObject: T {
        didSet {
            self.notifyClosure?()
        }
    }

    func setBoxDelegate<M where M:BoxDelegate, M.T == T>(delegate: M) {
        notifyClosure = {
            delegate.valueInBoxChanged(self)
        }
    }

    init(object: T) {
        self.boxedObject = object
    }
}

我希望验证这些字段,并发现其他$builder->add('home_team', 'choice', [$options]) ->add('away_team', 'choice', [$more_options]) ->add('timestamp', 'datetime_picker', [$usual_stuff]); 不存在同一个Matchhome_teamaway_team

我已经使用timestamp函数制作了UniqueMatchValidator,但我需要一些帮助。

我将使用表单中的值进行数据库调用以检查重复项,但为了做到这一点,我需要知道所有三个字段的值,同时将Validator应用于其中一个字段。

问题

如何从Validator中访问所有表单字段的值?

2 个答案:

答案 0 :(得分:0)

您的表单应该基本上包含一个实体。您需要使用实体中的回调进行验证。使用回调,您可以访问该实体的所有属性。

此链接肯定会帮助您更好地理解它: Symfony2 Form Validation Callback

答案 1 :(得分:0)

如上所述,使用FormTypes和数据类更好。

然而,即使使用数组,您也可以使用表单验证并使用事件侦听器获取所有字段:

        $builder
        ->addEventListener(FormEvents::POST_SUBMIT, function (FormEvent $event) {
            $event->getData(); //you will get array with field values
            $event->getForm()->addError(...); // if something happens error can be addded
        })

实际上,form validator也会使用此事件。