我对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);
}
但我仍然不知道这个解决方案是否正常。我想分开每个班级的顾虑和义务......你有什么建议?还有其他更优雅的解决方案还是坚持当前的解决方案?
答案 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