jfadich/eloquent-resources

轻松为Laravel 5.1+生成JSON响应

v1.1 2020-12-12 00:52 UTC

This package is auto-updated.

Last update: 2024-09-12 09:31:44 UTC


README

Eloquent resources为thephpleague/Fractal包提供Laravel集成。

Fractal使用转换器在你的数据库模式和API响应之间添加一层。每个模型都应该有一个转换器来定义它应该如何在API中表示。

Eloquent resources集成Fractal与Laravel,并添加一些辅助方法来帮助转换模型。它还添加了 artisan 命令来快速生成新的转换器。当请求包含嵌套关系时,它还可以自动预加载fractal包含并解析参数以应用正确的sortorder查询约束。

Fractal可以很冗长。这是使用eloquent模型和fractal转换器创建转换数据的代码。

 public function lastesPost()
 {
    $fractal = new League\Fractal\Manager();
    $post = App\Post::latest()->first();
    $transformer = new App\Transformers\PostTransformer();
    $resource = League\Fractal\Resource\Item($post, $transformers);

    $data = $fractal->createData($resource, $transformer)->toArray();
 
    return response()->json($data);
 }

Eloquent Resources将为您处理Fractal管理器。

public function lastesPost()
{
    $post = Post::latest()->first();

    return $this->respondWithItem($post);
}

安装

使用composer安装此包。

$ composer require jfadich/eloquent-resources

将服务提供者添加到app.php中的$providers数组中。

jfadich\EloquentResources\Providers\LaravelServiceProvider::class

如果您想进行自定义,请使用以下命令将配置发布到config/eloquent-resources.php

$ php artisan vendor:publish --provider="jfadich\EloquentResources\Providers\LaravelServiceProvider"

将Eloquent Resources添加到您的控制器中

只需将RespondsWithResources特质添加到您的基控制器或任何您希望使用Eloquent Resources的控制器中即可更新您的基控制器。

<?php

namespace App\Http\Controllers;

use Illuminate\Routing\Controller as BaseController;
use jfadich\EloquentResources\Traits\RespondsWithResources;

class Controller extends BaseController
{
    use RespondsWithResources;
}

##使用Eloquent Resources

Eloquent resources提供了respondWithItem()respondWithCollection(),可以轻松地将模型或模型集合转换为资源。只需提供模型和一个回调。该回调将传递给Fractal以创建资源,然后返回一个JsonResponse。

public function index()
{
    return $this->respondWithCollection(Post::all(), function($post) {
        return [
            'title'     => $post->title,
            'body'      => $post->body,
            'created'   => $post->created_at->getTimestamp(),
            'updated'   => $post->updated_at->getTimestamp()
        ];
    })
}

上面的示例将生成以下JSON。

{
    "data": [
        {
            "title": "Example Post",
            "body": "This is the post body.",
            "created": 1493604602,
            "updated": 1493604602
        }
    ]
}

转换器

使用像上面示例那样的匿名函数可以快速变得冗长。建议您使用转换器使此代码可重用。

具有转换器的每个模型都必须实现jfadich\EloquentResources\Contracts\Transformable接口。所需的方法可以使用jfadich\EloquentResources\Transformable特质包含。建议将此合同添加到扩展其余可转换模型的BaseModel中。

<?php

namespace App;

use jfadich\EloquentResources\Contracts\Transformable as TransformableContract;
use jfadich\EloquentResources\Traits\Transformable;
use Illuminate\Database\Eloquent\Model;

class BaseModel extends Model implements TransformableContract
{
    use Transformable;
}

对于以下示例,让我们使用一个Post模型。

<?php
namespace App;

class Post extends BaseModel
{
    public function author()
    {
        return $this->hasOne(Author::class);
    }
}

如果您从控制器中传递查询构建器对象,它还可以对结果进行排序和分页。Eloquent Resources将自动获取对应于模型的相应回调。

// This can be any query builder method like `Post::where('published', true);` or scope like `Post::latest()`
$posts = App\Post::query();

return $this->respondWithCollection($posts);

创建转换器

要为Post创建新的转换器,请执行以下命令。

$ php artisan make:transformer PostTransformer --model=Post

这将在app\Transformers\PostTransformer.php中生成一个新的模型类。

<?php

namespace App\Transformers;

use jfadich\EloquentResources\Transformer;
use App\BlogPost;

class PostTransformer extends Transformer
{    
    public function transform(Post $post)
    {
        return [
            //
        ];
    }
}

包含

有关转换器上包含数据的基本信息,请参阅Fractal文档。要将模型上的属性用于包含,请将其添加到转换器中的$availableIncludes属性。

class PostTransformer extends Transformer
{    
    protected $availableIncludes = ['author']
}

当使用Fractal转换器时,您必须定义includeAuthor()方法。此包将为您完成此操作。它可以自动检索任何eloquent关系并使用相关的转换器。