【问题标题】:Symfony 4 -- Form min max validationSymfony 4——表单最小最大验证
【发布时间】:2017-12-26 20:51:34
【问题描述】:

如何在验证前确定 min

这里是我的实体

/**
 * @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))

这是一个选项,在验证表单之前 min 必须低于 max

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

谢谢

【问题讨论】:

标签: forms symfony validation assert


【解决方案1】:

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

  1. 回调约束已在 cmets 中提及。
  2. 创建您自己的自定义约束
  3. 使用表达式约束

可能后者是最简单的。基本上它看起来像这样:

/**
 * @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

创建自定义约束比 Callback-constraint 还要复杂,因此我不会对此进行详细介绍,但您可以在文档中找到一篇不错的文章。

【讨论】:

    【解决方案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;
    

    【讨论】:

      【解决方案3】:

      您可以在form 中为.ex 编写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
      • 为什么不用Lifecycle Callbacks? @Rufinus
      猜你喜欢
      • 2019-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-14
      • 2017-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多