【发布时间】:2016-06-10 12:03:31
【问题描述】:
我有一个带有日期修改器的模型,例如 created_at。假设是一个通用的timestamp 属性。
当从客户端以 JSON 格式传递数据时,我会得到
{
timestamp: "2016-06-07T22:00:00.000Z"
}
该属性将用于设置一些模型,如下所示:
$model = new Foo();
$model->timestamp = Input::get('timestamp');
由于这将触发日期修改器,php Carbon 被调用并失败
InvalidArgumentException in Carbon.php line 425
Unexpected data found.
Trailing data
现在,这不是 Carbon 本身的问题,它能够处理 JSON 格式。如果你愿意尝试
new Carbon('2016-06-07T22:00:00.000Z');
您实际上会得到预期的结果。
据我所知,问题源于一种奇怪的 Eloquent 行为。从上面提到的InvalidArgumentException in Carbon.php line 425 看到这条踪迹:
in Carbon.php line 425
at Carbon::createFromFormat('Y-m-d H:i:s', '2016-06-07T22:00:00.000Z') in Model.php line 2915
at Model->asDateTime('2016-06-07T22:00:00.000Z') in Model.php line 2871
at Model->fromDateTime('2016-06-07T22:00:00.000Z') in Model.php line 2826
at Model->setAttribute('timestamp', '2016-06-07T22:00:00.000Z') in Model.php line 3351
Eloquent 正在尝试 createFromFormat 传递一个不反映实际 JSON 格式的 错误格式,这会导致 Carbon 异常。
另一方面,像上面提到的new Carbon($jsonDate) 这样的简单调用在这种情况下可以正常工作。
- 我应该如何解决这个问题?
- 这不应该是 Eloquent 的错误吗?
== 编辑 ==
我自己没有编写任何 mutator。我正在使用这样的默认日期修改器:
public function getDates() {
return ['timestamp'];
}
【问题讨论】:
-
这应该可以按预期工作。你如何定义突变体?你能发布模型代码和
Input::get('timestamp)的确切值吗(我假设它不是一个对象)。我将在这里设置的 mutator 留下来测试:public function setTimestampAttribute($value) { $this->attributes['timestamp'] = new \Carbon\Carbon($value); }和控制器代码:$obj->timestamp = '2016-06-07T22:00:00.000Z'; -
请发布您的 mutator。
-
我没有使用任何自定义修改器,请参阅编辑。
标签: php json laravel laravel-5