Ian*_*ips 1 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(),
));
}
}
Run Code Online (Sandbox Code Playgroud)
当我将输入留空时,我收到错误消息,正如预期的那样.但是当我在输入中键入"adsf"时,我看到输出"Form is valid".我使用YAML和PHP验证尝试了同样的事情.谁能看到我做错了什么?
谢谢, - 伊恩
之所以没有按预期工作,是因为Symfony的NumberFormatter存根实现中存在错误.如果您没有安装PHP intl扩展,将使用存根实现.
基本上,数字格式化程序尝试解析该值,并在发现它以非数字字符开头时返回false.它应该设置一个错误代码,然后在变换器中触发异常,但由于它没有,因此使用布尔值false并将其转换为整数(这也是一个错误).因此,您的"adsf"输入最终为整数0并传递类型断言.
我找到了一个关于这个的问题报告,我已经针对这两个错误发送了拉请求.
您可以使用这些修补程序来解决问题,或者您现在可以通过添加限制设置为1 的Min断言来解决此问题.