【问题标题】:Silex / Symfony2 Post-ValidationSilex / Symfony2 后验证
【发布时间】:2012-04-28 02:57:42
【问题描述】:

我确定这一定是 RTM 问题,但我一定是找错地方了。在 symfony 1.4 中,我经常使用验证器回调。例如,检查开始日期和结束日期的顺序是否正确。我正在 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--),但我觉得那里不合适。

有什么帮助吗?谢谢!

【问题讨论】:

    标签: forms validation symfony silex


    【解决方案1】:

    我猜你可以使用表单事件来处理这种事情;当然对于 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...'));
        }
    });
    

    希望这会有所帮助:)

    【讨论】:

    • 成功了!酷...我意识到我剪切“n”粘贴的代码中有一个$event 变量。不确定它是否会在您的应用程序上下文中可用,但我猜它是:)
    • 要将错误绑定到日期之一,应使用$event-&gt;getForm()-&gt;get('date1')-&gt;addError(...
    • 谢谢!更新了答案:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-17
    • 1970-01-01
    • 1970-01-01
    • 2015-11-05
    • 2016-06-01
    • 2014-04-28
    相关资源
    最近更新 更多