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
和 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