【问题标题】:Symfony4: Validate DateIntervalTypeSymfony 4:验证 DateInterval 类型
【发布时间】:2020-01-14 02:11:42
【问题描述】:

我目前被困在一个可能非常简单的问题上。

如何验证我的 DateIntervalType 是否为 != 0 - 表示至少选择了某些内容。 以及如何设置最小值/最大值:例如 1 天的最小间隔。

背景:我想根据用户选择每 X 年/月/天发送一封电子邮件 - 间隔 0 表示永久发送电子邮件,这是我不想要的。

遗憾的是,我还没有发现任何有用的东西。还尝试了整数断言,如@Assert\GratherThan 等,但这不起作用。

提前致谢

【问题讨论】:

    标签: symfony validation symfony4 dateinterval


    【解决方案1】:

    解决方案:感谢@Arleigh Hix 为我指明了正确的方向。

    我通过以下解决方案解决了我的问题:

    /**
     * @Assert\Expression("this.checkInterval()")
     */
    private $interval;
    
    public function checkInterval() {
        return $this->getTimestamp()->add($this->getInterval()) > $this->getTimestamp(); //getTimestamp() returns a DateTime
    }
    

    所以基本上只需将间隔添加到任何日期并将新日期与初始日期进行比较。通过这种方式,您还可以获得秒数的差异并比较最小最大值。

    更好的做法可能是创建一个custom validator,这将是我的下一步。

    【讨论】:

      【解决方案2】:

      看起来你应该可以像这样使用Expression constraint(我不确定在注释中构造\DateInterval的语法)

      /**
       * @Assert\Expression(
       *     "value >= minimum",
       *     values = { "minimum": new \DateInterval('P1D') }
       * )
       */
      $dateIntervalField;
      

      或者,您应该能够将最小间隔设置为实体属性,然后将值与之比较。

      public function __construct()
      {
        $this->minInterval = new \DateInterval('P1D');
      }
      
      /**
       * @Assert\GreaterThanOrEqual(
       *     value = this.minInterval
       * )
       */
      $dateIntervalField;
      

      【讨论】:

      • 感谢您的回复。我最终尝试使用返回new \DateInterval('P1D') 的getMinimum 函数来遵循表达式@Assert\Expression("value > this.getMinimum()")。遗憾的是,到目前为止,没有一个解决方案奏效。在我的示例中,没有任何用户输入是有效的。
      猜你喜欢
      • 2019-01-12
      • 2012-08-23
      • 1970-01-01
      • 2023-03-20
      • 2021-09-05
      • 1970-01-01
      • 1970-01-01
      • 2019-03-13
      • 2019-03-19
      相关资源
      最近更新 更多