【发布时间】:2020-01-01 18:09:42
【问题描述】:
我正在使用 Laravel 的 API Resource functionality 为客户很好地格式化我的回复,但我遇到的问题是下面的代码;
/**
* Transform the resource collection into an array.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function toArray($request)
{
return [
'data' => $this->collection->transform(function ($item)
{
return [
'id' => $item->id,
'title' => Str::limit($item->title, 32),
'body' => Str::limit($item->body, 32),
'created_at' => $item->created_at->format('d M Y, H:i a'),
'user' => $item->user
];
}),
'links' => [
'current_page' => $this->currentPage(),
'total' => $this->total(),
'per_page' => $this->perPage(),
],
];
}
使用此代码时,出现错误; "Call to a member function format() on null" 在 created_at 属性上。
但是我已经使用dd($this->collection) 来确认没有一个属性实际上是null,我不确定是什么原因造成的。我的迁移包含$table->timestamps();,在我的工厂内部,我根本没有覆盖时间戳,所以我不确定问题出在哪里。
这是我在下面运行的测试也得到了这个错误;
factory(News::class, 10)->create();
$user = factory(User::class)->create();
$this->actingAs($user)
->get('/news')
->assertOk()
->assertPropCount('news.data', 10)
->assertPropValue('news.data', function ($news)
{
$this->assertEquals(
[
'id', 'title', 'body', 'created_at',
'user',
],
array_keys($news[0])
);
});
assertPropCount 和 assertPropValue 等额外功能来自 InertiaJS 演示应用程序,因为我在项目中使用了 InertiaJS。
希望有人能够提供帮助,正如我在其他几个地方询问过的那样,似乎没有人知道这是什么原因,并且根据我的调试,这似乎不是一个有效的关于为什么created_at 为空的解释。
请注意,如果我在代码中也将$item->user 转换为$item->user->toArray(),那么抱怨user 不是空时也会失败。似乎尝试将任何方法链接到任何属性都会导致此 null 错误,我不知道为什么。
【问题讨论】:
-
你是否在Model的$fillable属性中定义了created_at?
-
@senty 在工厂上默认创建它们。无论哪种方式,我都尝试过并没有改变错误。
-
@ChiragKhatri 是的,已经尝试过了。没有什么不同。
-
如果你创建一个 dummy User 模型(没有 Faker),时间戳字段是否为空?
-
@sentry 我不太清楚你的意思。我正在使用
'user_id' => factory(User::class),在 NewsFactory 上生成我的用户。
标签: php laravel phpunit inertiajs