使用Assert注释的Symfony2验证不起作用

时间:2011-10-24 23:29:29

标签: php validation symfony

更新:因为我没有得到任何答案,所以我使用一个更简单的例子重写了整篇文章。希望这有助于揭露问题。

我在表单验证方面遇到了麻烦。我可以使NotBlank()断言起作用,但Type()对我不起作用。首先,这是代码:

/* ...\Entity\LineItem.php */
<?php

namespace Rialto\ExperimentBundle\Entity;

use Symfony\Component\Validator\Constraints as Assert;

class LineItem
{
    /**
     * @var integer
     * @Assert\NotBlank()
     * @Assert\Type(type="integer")
     */
    private $quantity = 0;

    public function getQuantity()
    {
        return $this->quantity;
    }

    public function setQuantity($quantity)
    {
        $this->quantity = $quantity;
    }
}

/* ...\Controller\DefaultController.php */
<?php

namespace Rialto\ExperimentBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Response;

use Rialto\ExperimentBundle\Entity\LineItem;


class DefaultController extends Controller
{
    public function indexAction()
    {
        return $this->testValidation();
    }

    private function testValidation()
    {
        $item = new LineItem();

        $form = $this->createFormBuilder($item)
            ->add('quantity', 'integer')
            ->getForm();

        $request = $this->getRequest();
        if ( $request->getMethod() == 'POST') {
            $form->bindRequest($request);

            if ( $form->isValid() ) {
                return new Response('Form is valid.');
            }
        }

        return $this->render('RialtoCoreBundle:Form:basicForm.html.twig', array(
            'form' => $form->createView(),
        ));
    }
}

当我将输入留空时,我收到错误消息,正如预期的那样。但是当我在输入中键入“adsf”时,我看到输出“Form is valid”。我使用YAML和PHP验证尝试了同样的事情。谁能看到我做错了什么?

谢谢, - 伊恩

2 个答案:

答案 0 :(得分:9)

这不能正常工作的原因是因为Symfony的NumberFormatter存根实现中存在错误。如果您没有安装PHP intl扩展,将使用存根实现。

基本上,数字格式化程序会尝试解析值returns false when it finds that it starts with a non-numeric character。它应该设置一个错误代码,然后在变换器中触发异常但是,因为它没有,所以使用布尔值false和gets typecast to an integer(这本身也是一个bug)。因此,您的“adsf”输入最终为整数0并传递类型断言。

我找到了an issue report about this,我已经针对这两个错误发送了拉请求。

您可以使用这些修补程序来解决问题,或者您现在可以通过添加Min assertion并将限制设置为1来解决此问题。

答案 1 :(得分:0)

可能你应该改变这个:

$this->isPost( $request )

为此:

$request->isPost()

这只是猜测..但我希望它有所帮助!