lukevear / laravel-transformer
此包已被废弃,不再维护。未建议替代包。
用于 Laravel Eloquent 模型和集合的简单转换器。
1.0.0
2017-05-17 01:59 UTC
Requires
- php: >=7.0
- illuminate/support: >=5.1.0
This package is not auto-updated.
Last update: 2020-08-21 20:40:18 UTC
README
简单的 Eloquent 和 Collection 转换。有助于确保您的 API 输出一致,并防止代码重复。
安装
使用 composer 安装此包
composer require lukevear/laravel-transformer
要将包注册到 Laravel 中,请将以下内容添加到 config/app.php
LukeVear\LaravelTransformer\TransformerServiceProvider::class,
可选:安装配置文件
php artisan vendor:publish --provider="LukeVear\LaravelTransformer\TransformerServiceProvider"
创建转换器
创建转换器很简单。只需扩展 AbstractTransformer
类并实现所需的逻辑。
转换器只需要一个 run
方法。在 run
方法中,您将实现转换模型/集合所需的任何逻辑。
例如,以下内容可以用于创建一个一致的 'User API 模型',供客户端消费。
转换器
<?php namespace App\Transformers; use App\User; use LukeVear\LaravelTransformer\AbstractTransformer; class UserTransformer extends AbstractTransformer { /** * Transform the supplied data. * * @param User $model * @return array */ public function run($model) { return [ 'id' => $model->id, 'name' => $model->first_name . ' ' . $model->last_name ]; } }
用法
return response()->json( transform($user, new UserTransformer) );
自动转换
您可以在代码库中的每个模型中指定要使用的转换器,并指定要使用的 '组' 转换器。
要设置自动转换,请编辑 config/laravel-transformer.php
(确保您已运行上述 vendor:publish 命令)。
例如,如果您有一个 v1
和 v2
API,您可以在配置文件中设置以下内容
<?php return [ /* |-------------------------------------------------------------------------- | Model <-> Transformer Binding Groups |-------------------------------------------------------------------------- | | This allows you to specify which transformers should automatically be | used when the transform() function is provided a Eloquent model. | */ 'groups' => [ 'default' => [ // App\User::class => App\Transformers\UserTransformer::class, ], 'v1' => [ App\Models\User::class => App\Transformers\v1\UserTransformer::class, ], 'v2' => [ App\Models\User::class => App\Transformers\v2\UserTransformer::class, ], ], ];
然后,在您的全局中间件中,您可以根据所消耗的 API 版本指定要使用的转换组
public function handle($request, Closure $next) { if ($request->is('v1*')) { TransformerEngine::setGroup('v1'); } else { TransformerEngine::setGroup('v2'); } return $next($request); }
然后,您可以使用以下方式在任何控制器中转换您的 User 模型
return response()->json( transform($user) );
包含
在手动创建转换器时,您可以提供额外的 '包含',以提供转换器的上下文。
例如,您可能希望将用户的设置模型与用户模型一起包含。为此,您可以实现如下
<?php namespace App\Transformers; use App\User; use LukeVear\LaravelTransformer\AbstractTransformer; class UserTransformer extends AbstractTransformer { /** * Transform the supplied data. * * @param User $model * @return array */ public function run($model) { $response = [ 'id' => $model->id, 'name' => $model->first_name . ' ' . $model->last_name ]; if ($this->hasInclude('settings')) { $response['settings'] = transform($model->settings, new UserSettingsTransformer); } return $response; } }
要告诉转换器您希望包含设置,您可以在路由/控制器中使用以下内容
return response()->json( transform($user, (new UserTransformer)->setIncludes(['settings']) );