我最近发现演示者(like this one)实现了decorator pattern,这是向现有Laravel模型添加字段和逻辑的好方法。请在下面的问题中使用以下示例:
// Tack on a new readable timestamp field.
public function timeago()
{
return $this->object->created_at->whenForHumans();
}
// Wrap an existing field with some formatting logic
public function created_at()
{
return $this->object->created_at->format('Y-m-d');
}
然后我可以在我的视图中使用这些演示者字段:
{{ $object->timeago }}
{{ $object->created_at }}
如何为返回JSON响应而不是Blade视图的API实现装饰器模式?在我读过的所有Laravel / JSON文章中,对象立即返回而不经历任何转换/演示者逻辑。 e.g:
// converting a model to JSON
return User::find($id)->toJson();
// returning a model directly will be converted to JSON
return User::all();
// return associated models
return User::find($id)->load('comments')->get();
如何在JSON响应中实现presenter字段?
$object->timeago
$object->created_at
答案 0 :(得分:2)
正如您所提到的,User :: all返回JSON,所以请执行以下操作:
获取数据并返回装饰响应的一些函数:
public function index()
{
$news = News::all();
return $this->respond([
'data' => $this->newsTransformer->transformCollection($news->toArray())
]
);
}
上面的函数将调用Transformer :: transformCollection:
<?php namespace Blah\Transformers;
abstract class Transformer {
public function transformCollection(array $items)
{
return array_map([$this, 'transform'], $items);
}
public abstract function transform($item);
}
反过来会调用NewsTransformer :: transform():
public function transform($news)
{
return [
'title' => $news['title'],
'body' => $news['body'],
'active' => (boolean) $news['some_bool'],
'timeago' => // Human readable
'created_at' => // Y-m-d
];
}
最终结果是JSON具有您需要的格式,在这种情况下:
{
data: {
title: "Some title",
body: "Some body...",
active: true,
timeago: "On Saturday, 1st of March",
created_at: "2014-03-01"
}
}
顺便说一下,Laracasts有一个关于构建API的优秀系列 - 希望有所帮助!
为清楚起见,第一个代码段中的响应函数只是使用状态代码和任何标题包装数据,如:
return Response::json($data, 200);