Symfony 4 -- 表单最小值和最大值验证

3

如何在验证之前确保 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))

这是一个选项,在验证表单之前,最小值必须小于最大值。

如果表单不正确,我该如何验证并向用户发送更改表单的消息。

谢谢。


http://symfony.com/doc/current/reference/constraints/Callback.html - zerkms
难道没有更简单的解决方案吗? - Dassef
我不确定回调函数是否复杂。你已经尝试过了吗? - zerkms
3个回答

3

我可以想到多种方法来解决这个问题。

  1. 在评论中已经提到了回调限制(Callback-Constraint)。
  2. 创建自定义限制。
  3. 使用表达式限制(Expression-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

创建自定义约束比回调约束更加困难,因此我不会详细介绍,但你可以在文档中找到一篇好的文章。


2
幸运的是,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;

0

您可以在表单中编写minmax验证,例如:

->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;

     ...............................


}

那不是 OP 想要的。他想要断言字段 min <= 字段 max - Rufinus
为什么不使用“生命周期回调”?@Rufinus - Imanali Mamadiev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接