Symfony 4 -- 表单最小最大验证
Symfony 4 -- Form min max validation
如何在验证前确保 min < max
这是我的实体
/**
* @var int
*
* @ORM\Column(name="min", type="integer", nullable=true)
*/
private $min;
/**
* @var int
*
* @ORM\Column(name="max", type="integer", nullable=true)
*/
private $max;
形式为:
->add('min', NumberType::class,array('required' => false))
->add('max', NumberType::class,array('required' => false))
这是一个选项,在验证表单之前,最小值必须低于最大值
如果不正确,我如何验证并向用户发送消息以更改他的表单。
谢谢
我可以想到多种方法来解决这个问题。
- Callback-Constraint 已经在评论中提到了。
- 创建您自己的自定义约束
- 使用表达式约束
可能后者是最简单的。基本上它看起来像这样:
/**
* @Assert\Type("integer")
* @Assert\Expression("this.getMin() <= this.getMax()")
*/
private $min;
/**
* @Assert\Type("integer")
*/
private $max;
参见:https://symfony.com/doc/current/reference/constraints/Expression.html
创建自定义约束比回调约束还要工作,所以我不会详细介绍,但您可以在文档中找到一篇不错的文章。
您可以在 form
中为 .ex 编写 min
和 max
验证:
->add('ordering', NumberType::class, array(
'attr' => array('min' => 1, 'max' => 100)
))
也在Entity
:
// src/Entity/YourFoo.php
namespace App\Entity;
use Symfony\Component\Validator\Constraints as Assert;
class YourFoo
{
/**
* @Assert\Range(
* min = 120,
* max = 180,
* minMessage = "You must be at least {{ limit }}cm tall to enter",
* maxMessage = "You cannot be taller than {{ limit }}cm to enter"
* )
*/
protected $fooNumber;
...............................
}
幸运的是,Symfony >3.4 有更好的解决方案。
GreaterThan、GreaterThanOrEqual、LessThan、LessThanOrEqual 验证约束带有 propertyPath
选项,允许指定要比较的对象 属性。
我很惊讶它没有早点实现。
/**
* @Assert\LessThanOrEqual(
* message="Too high",
* propertyPath="maxSubscribers")
* @Assert\LessThanOrEqual(
* message="Too high",
* value=100000000)
*/
private $min;
/**
* @Assert\GreaterThanOrEqual(
* message="Too low",
* value=1)
* @Assert\LessThanOrEqual(
* message="Too high",
* value=100000000)
*/
private $max;
如何在验证前确保 min < max
这是我的实体
/**
* @var int
*
* @ORM\Column(name="min", type="integer", nullable=true)
*/
private $min;
/**
* @var int
*
* @ORM\Column(name="max", type="integer", nullable=true)
*/
private $max;
形式为:
->add('min', NumberType::class,array('required' => false))
->add('max', NumberType::class,array('required' => false))
这是一个选项,在验证表单之前,最小值必须低于最大值
如果不正确,我如何验证并向用户发送消息以更改他的表单。
谢谢
我可以想到多种方法来解决这个问题。
- Callback-Constraint 已经在评论中提到了。
- 创建您自己的自定义约束
- 使用表达式约束
可能后者是最简单的。基本上它看起来像这样:
/**
* @Assert\Type("integer")
* @Assert\Expression("this.getMin() <= this.getMax()")
*/
private $min;
/**
* @Assert\Type("integer")
*/
private $max;
参见:https://symfony.com/doc/current/reference/constraints/Expression.html
创建自定义约束比回调约束还要工作,所以我不会详细介绍,但您可以在文档中找到一篇不错的文章。
您可以在 form
中为 .ex 编写 min
和 max
验证:
->add('ordering', NumberType::class, array(
'attr' => array('min' => 1, 'max' => 100)
))
也在Entity
:
// src/Entity/YourFoo.php
namespace App\Entity;
use Symfony\Component\Validator\Constraints as Assert;
class YourFoo
{
/**
* @Assert\Range(
* min = 120,
* max = 180,
* minMessage = "You must be at least {{ limit }}cm tall to enter",
* maxMessage = "You cannot be taller than {{ limit }}cm to enter"
* )
*/
protected $fooNumber;
...............................
}
幸运的是,Symfony >3.4 有更好的解决方案。
GreaterThan、GreaterThanOrEqual、LessThan、LessThanOrEqual 验证约束带有 propertyPath
选项,允许指定要比较的对象 属性。
我很惊讶它没有早点实现。
/**
* @Assert\LessThanOrEqual(
* message="Too high",
* propertyPath="maxSubscribers")
* @Assert\LessThanOrEqual(
* message="Too high",
* value=100000000)
*/
private $min;
/**
* @Assert\GreaterThanOrEqual(
* message="Too low",
* value=1)
* @Assert\LessThanOrEqual(
* message="Too high",
* value=100000000)
*/
private $max;