jfadich / eloquent-resources
轻松为Laravel 5.1+生成JSON响应
Requires
- php: >=7.3
- illuminate/console: 5.*|6.*|7.*
- illuminate/database: 5.*|6.*|7.*
- illuminate/http: 5.*|6.*|7.*
- illuminate/support: 5.*|6.*|7.*
- league/fractal: ^0.19.0
Requires (Dev)
- phpunit/phpunit: ^6.1
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包含并解析参数以应用正确的sort
和order
查询约束。
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关系并使用相关的转换器。