$rules 如何解析日期变量值

How are $rules resolved for date variable values

对于以下 $rules,after:todayafter:start_date 按预期解析。但是,我不明白,它实际上是如何工作的,但是……我检查了代码,但我无法弄清楚。 Laravel 发送 after:strtotime 之后的值。 todaystrtotime 的预定义值吗?但是 start_date 是我刚刚创建的数组中的一个键。它是如何工作的?

public static $rules = array(
  'name' => 'required', 
  'description' => '', 
  'location' => 'required|alpha-dash', 
  'cost' => 'numeric|min:0', 
  'min_age' => 'numeric|min:0', 
  'max_age' => 'numeric|min:0', 
  'start_date' => 'required|date|after:today', 
  'end_date' => 'required|date|after:start_date', 
  'start_time' => 'required|time', 
  'end_time' => 'required|time', 
  'registration_start_date' => 'date', 
  'registration_end_date' => 'date', 
  'max_attendees'  => 'numeric|min:0'
);

让我们从Illuminate\Validation\Validator

中的validateAfter方法开始
protected function validateAfter($attribute, $value, $parameters)
{
    // [unimportant code]

    if ( ! ($date = strtotime($parameters[0])))
    {
        return strtotime($value) > strtotime($this->getValue($parameters[0]));
    }

    return strtotime($value) > $date;
}

首先它会检查第一个参数是否是某种形式的日期。在你的情况下 today。如果不是,它将调用 $this->getValue 并再次使用 strtotimegetValue() 只是 returns 属性的名称的值:

protected function getValue($attribute)
{
    if ( ! is_null($value = array_get($this->data, $attribute)))
    {
        return $value;
    }
    elseif ( ! is_null($value = array_get($this->files, $attribute)))
    {
        return $value;
    }
}

注意 这也意味着任何可以被 strtotime 解释的参数都将被用作那个。因此,如果您有一个名为 today 的属性,则将使用 strtotime('today') 而不是属性的值来进行验证