lukevear/laravel-transformer

此包已被废弃,不再维护。未建议替代包。

用于 Laravel Eloquent 模型和集合的简单转换器。

1.0.0 2017-05-17 01:59 UTC

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 命令)。

例如,如果您有一个 v1v2 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'])
);