Laravel 中的 Carbon 意外日期时间格式

Carbon unexpected date-time format in Laravel

我对 Carbon 和 HTML5 输入 input[type=datetime-local] 有疑问,因为此输入以 Y-m-d\TH:i 格式发送数据时间(例如 2016-11-20T11:45)。

我的控制器中有方法:

public function store(ModelStoreFormRequest $request) 
{
    $model = new Model($request->all());
    $model->save();
    return redirect->action(/*...*/);
}

我遇到异常:

InvalidArgumentException in Carbon.php line 582: Data Missing
1. in Carbon.php line 582
2. at Carbon::createFromFormat('Y-m-d H:i:s', '2016-11-20T11:45') in HasAttributes.php line 709

所以我通过在我的模型中创建下一个函数解决了这个问题:

public function setStartedAtAttribute($startedAt)
{
    if( $startedAt instanceof Carbon ) {
        $this->attributes['started_at'] = $startedAt;
        return;
    }

    if( strpos($startedAt, 'T' ) ) {
        $this->attributes['started_at'] = Carbon::createFromFormat('Y-m-d\TH:i', $startedAt);
        return;
    }

    $this->attributes['started_at'] = Carbon::createFromFormat('Y-m-d H:i:s', $startedAt);
}

但是我不喜欢这个方案,不知有没有更优雅的方案?我正在考虑使用 ModelStoreFormRequest::prepareForValidation() 方法并在那里检查日期格式是否为:Y-m-d\TH:i 将日期时间值更改为格式:Y-m-d H:i:s,或者可能使用 Carbon::parse() 方法这个:

protected function prepareForValidation() 
{
    $input = $this->all();
    $input['started_at'] = \Carbon\Carbon::parse($input['started_at']);
    $this->replace($input);
}

但我仍然不知道这个解决方案是否可行。我试图将每个 class 的关注点和义务分开......你有什么建议?还有其他更优雅的解决方案还是坚持当前的解决方案?

不要创建自定义函数来更改格式或编辑 Laravel 的任何基数,这里是简单的解决方案,试试这个

$startedAt= Carbon::createFromFormat('Y-m-d\TH:i','2016-11-20T11:45');

你会 return :

2016-11-20 11:45:00

现在关于你的顾虑,如果你以后不需要在多个地方使用它,我会建议你在控制器中使用它。

如果您需要将日期以该格式存储到数据库中,并且在多个地方不需要像这样,您也可以将它用作模型中的修改器

突变体

public static $snakeAttributes = false; // because you have camel case here
public function setStartedAtAttribute($value)
{
    $this->attributes['startedAt'] = Carbon::createFromFormat('Y-m-d\TH:i',$value);;
}

访问器

public function getStartedAtAttribute()
    {
        $startedAt = $this->attributes['startedAt'];
        return $startedAt
    }

如果您需要在多个地方使用它,您可以为您的函数创建一个单独的特征,我建议这是最佳做法。

trait YourTraitName{
  public function yourfunction(){
$startedAt= Carbon::createFromFormat('Y-m-d\TH:i','2016-11-20T11:45');
return $startedAt;
    }
}

排除中间件,中间件一般用于身份验证阅读更多关于中间件here

更多Carbon相关操作可以阅读here and test here