DavidIanBonner/presenter

Laravel 的展示器(presenter)和转换器(transformer)包。

2.0.1 2019-09-14 12:51 UTC

This package is auto-updated.

Last update: 2024-09-15 00:06:58 UTC


README

Build Status StyleCI

这是一个用于 Laravel 应用的简单数据展示器/转换器,可用于视图和 JSON。

在大多数情况下,通过 REST API 输出 JSON 所需的数据转换与我们在视图中需要的数据相同。这个包可以防止使用转换器来处理 JSON(例如使用 Fractal – 对于大型应用程序和复杂转换来说非常棒)和属性修改器。无论是返回视图还是 JSON,数据都可以使用一个类来展示和转换。

安装

通过 Composer 安装包

composer require davidianbonner/presenter

Laravel 5.5+ 使用包自动发现功能,不需要您手动添加 ServiceProvider。但是,如果您正在使用 5.4 或更早版本,请将包服务提供者在 config/app.phpproviders 数组中添加。

DavidIanBonner\Presenter\PresenterServiceProvider::class

config/app.phpaliases 中添加 facade

'Presenter' => DavidIanBonner\Presenter\Facades\Presenter::class,

然后发布配置文件

php artisan vendor:publish --provider="DavidIanBonner\Presenter\PresenterServiceProvider"

工作原理

只有在对象实现了 Presentable 接口时,才会执行 '转换'。

如果可展示的对象是一个 Eloquent 模型,展示器将检查已加载的关系,并尝试转换它们,用转换器对象替换现有关系。

展示/转换对象

转换时,对象将被注入到一个转换器类中,这将让您有权访问魔法方法、对象的魔法获取器以及自动的 toArraytoJson 输出。

// Transform an object
Presenter::transform(Book::find(1), BookTransformer::class);

// or with pre-set transformers
Presenter::transform(Book::find(1));

预置转换器

config/presenter.php 中设置可展示的 => 转换器关系

'transformers' => [
    App\Models\Book::class => App\Transformers\BookTransformer::class,
    App\OtherObject\Foo::class => App\Transformers\FooTransformer::class,
],

转换器

转换器必须扩展 DavidIanBonner\Presenter\Transformer。转换器可以使用类似于 Eloquent 的方式使用属性修改方法。

<?php

namespace App\Transformers\BookTransformer;

use DavidIanBonner\Presenter\Transformer;
use DavidIanBonner\Presenter\Presentable;

class BookTransformer extends Transformer
{
    // Optional
    protected function bootTransformer(Presentable $object) { }

    public function foo()
    {
        // Given $this->object->foo = 'bar'
        // Calling $bookTransformer->foo will return "bar_mutated"
        return $this->object->foo.'_mutated';
    }

    // Extend toArray if required to return a specified dataset
    public function toArray() { }

    // Extend toJson if required to return a different dataset from toArray
    public function toJson() { }
}

响应宏

为了简化您的代码并避免为所有对象重复 Present::transform(),有两个方便的宏可用来自动处理。

视图
use Illuminate\Support\Facades\Response;
...
public function index()
{
    // Using the settings above, book will be available in the view
    // as an instance of App\Transformers\BookTransformer

    $data = ['book' => Book::find(1)];

    return Response::present('view-name', $data, $statusCode, $headers);
}

还有一个方便的辅助方法可用于在 view 辅助方法之上设置。

public function index()
{
    return present('view-name', ['book' => Book::find(1)], $statusCode, $headers);
}
JSON

JSON 转换与视图的处理方式略有不同。Response::json() 会检查对象是否实现了 Illuminate\Contracts\Support\Jsonable 接口,如果是,则对该对象调用 toJson。基础转换器的 toJson 方法将调用 toArrayjson_encodetoArray 将尝试收集传递给它的 Presentable 对象的键,并尝试在转换器上获取这些键,这将转而调用任何魔法方法等。

use Illuminate\Http\JsonResponse;
...
public function index()
{
    // Using the settings above, book will be transformed and
    // built from App\Transformers\BookTransformer

    $data = ['book' => Book::find(1)];

    return JsonResponse::present($data, $statusCode, $headers, $options);
}

集合宏

有一个集合宏可用于遍历可数组的项集并转换任何可展示的对象。

// Get a collection of BookTransformer objects
Collection::present(Book::get());

贡献

欢迎贡献!请阅读 CONTRIBUTING 获取详细信息。

版权和许可证

DavidIanBonner/presenter 库版权 © David Bonner,并许可在 MIT 许可证(MIT)下使用。请参阅 LICENSE 获取更多信息。