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

时间:2017-10-02 14:58:53

标签: php laravel datetime laravel-5 php-carbon

我对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);
}

但我仍然不知道这个解决方案是否正常。我想分开每个班级的顾虑和义务......你有什么建议?还有其他更优雅的解决方案还是坚持当前的解决方案?

1 个答案:

答案 0 :(得分:2)

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

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

会回复你:

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并测试here