Php 使用断言批注的Symfony2验证无效

Php 使用断言批注的Symfony2验证无效,php,validation,symfony,Php,Validation,Symfony,更新:因为我没有得到任何答案,所以我用一个简单得多的例子重写了整篇文章。希望这有助于暴露问题 我在表单验证方面遇到问题。我可以让NotBlank()断言工作,但Type()对我不起作用。首先,代码如下: /* ...\Entity\LineItem.php */ <?php namespace Rialto\ExperimentBundle\Entity; use Symfony\Component\Validator\Constraints as Assert; class Lin

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

我在表单验证方面遇到问题。我可以让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(),
        ));
    }
}
/*…\Entity\LineItem.php*/

也许你应该改变这一点:

$this->isPost( $request )
为此:

$request->isPost()

这只是一个猜测,但我希望能有所帮助

之所以不能按预期工作,是因为Symfony的NumberFormatter存根实现中存在错误。如果没有安装PHP intl扩展,将使用存根实现

基本上,数字格式化程序尝试解析值和。它应该设置一个错误代码,然后在转换器中触发一个异常,但是,因为它没有,所以使用了布尔值false,并且(这本身也是一个bug)。因此,“adsf”输入以整数0结束,并传递类型断言

我找到了这两个bug,并向它发送了请求


你可以使用这些补丁来解决这个问题,或者你现在可以通过添加一个限制设置为1的方法来解决这个问题。

我忘了提到
$this->isPost($request)
是我写的一个方法。这相当于说
$request->getMethod()=“POST”
。此外,该块中的代码正在执行(应该是这样),所以我认为这不是问题所在。答案很好!谢谢你的链接,特别是关于bug报告的链接。