Silex / Symfony2后验证

时间:2012-04-16 18:52:30

标签: 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();
};

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

有任何帮助吗?谢谢!

1 个答案:

答案 0 :(得分:7)

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

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

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

Description of Symfony2 form events?

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

修改

好的,我发现了一些东西,但我正在修改Symfony代码中的内容,所以我不是100%就此,但它可能是一个起点(我希望):

$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...'));
    }
});

希望这会有所帮助:)