Silex/Symfony2后验证

lop*_*ded 2 forms validation symfony silex

我确定这必须是一个RTM问题,但我必须在错误的地方寻找.在symfony 1.4中,我使用了post validator回调函数.例如,检查开始日期和结束日期的顺序是否正确.我正在开发Silex中的应用程序,但无法弄清楚如何添加类似的功能作为验证器.这就是我正在使用的(基本上):

$app['form.example'] = function ($app) {
    $constraints = new Assert\Collection(array(
        'date1' => new Assert\Date(),
        'date2' => new Assert\Date(),
    ));

    $builder = $app['form.factory']->createNamedBuilder('form', 'example', array(), array('validation_constraint' => $constraints));

    return $builder
        ->add('date1', 'date')
        ->add('date2', 'date')
        ->getForm();
};
Run Code Online (Sandbox Code Playgroud)

我可以将自己的验证测试放在'过程表单'部分,例如:if ($form->isValid() && --my datetest--)但它对我来说不合适.

有帮助吗?谢谢!

Dar*_*ght 7

我想你可以使用表格事件来做这种事情; 当然对于Symfony2,所以我也假设Silex?有一篇关于使用它来生成动态表单的食谱文章:

http://symfony.com/doc/current/cookbook/form/dynamic_form_generation.html

另一个SO问题中的一些有用的细节:

Symfony2表单事件的描述?

本来可以发誓我和某人讨论过这件事,但是我找不到问题.我曾使用BIND_CLIENT_DATA计算某些代码中的某些表单字段; 我会看看能否把它挖出来.

编辑

好吧,我发现了一些东西,但我正在修改Symfony代码,所以我不是百分之百,但它可能是一个起点(我希望):

$builder->addEventListener(FormEvents::BIND_NORM_DATA, function($event) {
    // your form data
    $data = $event->getData();

    // get date objects - if you cannot dereference this way try getters
    $d1 = $data['date1'];
    $d2 = $data['date2'];

    // naive comparison :)
    $isCorrectDateOrder = $d1->getTimestamp() < $d2->getTimestamp();

    // check the comparison
    if (!$isCorrectDateOrder) {
        // trouble... create and add a FormError object to the form
        $event->getForm()->get('date1')->addError(new \Symfony\Component\Form\FormError('uh oh...'));
    }
});
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助 :)