Laravel为JSON响应提供者

时间:2014-05-24 22:56:35

标签: php json laravel-4

我最近发现演示者(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

1 个答案:

答案 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);