如何解决日期变量值的$规则

时间:2015-01-12 21:51:44

标签: php laravel

对于以下$规则,after:todayafter:start_date按预期解决。但是,我不明白,它实际上是如何工作的但是...我检查了代码,但我无法弄明白。 Laravel在after:strtotime之后发送值。 today的预定义值是strtotime吗?但是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'
);

1 个答案:

答案 0 :(得分:1)

让我们从validateAfter

中的Illuminate\Validation\Validator方法开始
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()只是按名称返回属性的值:

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')将用于验证