Symfony 2自定义表单验证的好方法,两个选择字段

时间:2012-11-12 22:54:54

标签: php forms symfony doctrine

在Symfony2中,我添加并编辑了两个选项字段作为下拉列表。第一个包含年份,第二个包含年份 几个星期。所以我想检查所选的年份和周是不是过去的时间。我的意思是很好的选择,并希望坚持如果年:2013年和周:5, 但是如果年份:2012年和第5周都不好。这里想要警告它。

基本上我使用doctrine实体管理器和isValid()来验证表单,然后我将对象保存到数据库。

我对网上发现的很多方法感到有点不安。

所以我想知道哪种方式最适合我验证这些?我的意思是实体验证,非实体,以及在哪里搜索它的位置。 :)

非常感谢你。

1 个答案:

答案 0 :(得分:1)

我会选择CallbackValidation:

http://symfony.com/doc/2.0/reference/constraints/Callback.html

isValid()调用期间会触发验证,以便您知道它何时失败。

至于验证码,我认为这应该做的事情(我还没有运行):

/**
 * @Assert\Callback(methods={"isYearWeekValid"})
 */
class YourEntity
{
     ... here go $year and $week


    public function isYearWeekValid(ExecutionContext $context)
    {
        $firstInYear = \DateTime:createFromFormat('Y-m-d', $this->year . '-01-01');
        $interval = new \DateInterval(sprintf('P%dW', $this->week * 7));
        $firstDayOfWeek = $firstInYear->add($interval); # beware, $firstInYear object     was modified hear as well

        $now = new \DateTime();
        if ( $firstInWeek < $now ){
            $context->addViolation('Invalid year/week combination!', array(), null);
        }else{
            // IT'S OK
        }
    }
}

我使用注释来指定验证,但为了这个目的,你也可以使用XMLYAML ......基本上它都是一样的......

希望这会有所帮助......