【问题标题】:Symfony2 validation using Assert annotation does not work使用 Assert 注释的 Symfony2 验证不起作用
【发布时间】:2011-10-24 23:29:28
【问题描述】:

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

我在进行表单验证时遇到问题。我可以让 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”时,我看到输出“表单有效”。我使用 YAML 和 PHP 验证尝试过同样的事情。谁能看到我做错了什么?

谢谢, - 伊恩

【问题讨论】:

    标签: php validation symfony


    【解决方案1】:

    这不能按预期工作的原因是 Symfony 的 NumberFormatter 存根实现中的一个错误。如果您没有安装 PHP intl 扩展,将使用存根实现。

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

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

    您可以使用这些补丁来解决问题,也可以通过添加 Min assertion 并将限制设置为 1 来暂时解决它。

    【讨论】:

    • 很好的答案!感谢您提供链接,尤其是错误报告。
    【解决方案2】:

    也许你应该改变这个:

    $this->isPost( $request )
    

    为此:

    $request->isPost()
    

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

    【讨论】:

    • 我忘了说$this-&gt;isPost($request)是我写的一个方法。相当于说$request-&gt;getMethod() == 'POST'。此外,该块内的代码正在执行(应该如此),所以我认为这不是问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-19
    • 1970-01-01
    • 1970-01-01
    • 2011-10-04
    相关资源
    最近更新 更多