louis1021/presento

Presento 是一个用于 PHP 5.6.40 数据展示器的包

v1.1.1 2019-11-05 07:18 UTC

This package is auto-updated.

Last update: 2024-09-16 12:31:54 UTC


README

使用转换器和过滤字段通过展示器获取特定格式。

差异和变更日志

20191216 10:20 - 更新安装命令以包含 dev-master,移除稳定最小稳定性。
20191204 20:08 - 修复了在启用 formatDatatable 而没有转换器时的问题。
20191126 11:10 - 修复了在启用 formatDatatable 时的问题。
20191125 19:55 - 为类 presenter 添加了 $multi 属性,以添加处理多个记录的功能。
20191122 18:05 - 更新了此包的最终和唯一用途。Presento 世界到此结束。
20191122 18:01 - 为了清晰的约定和未来的使用,需要更改命名空间。
20191122 17:18 - 添加了格式化:数据表
20191122 16:35 - 应用了 PSR-0 缩进。
20191122 16:32 - 使用 PHPUnit 成功测试了所有提供的功能。
20191122 16:30 - 在多维数组上发现问题,最终得到修复。
20191122 12:18 - PHP 5.6.40 兼容。
20191122 11:30 - 为什么?是的。我 fork 了。

致谢

https://medium.com/swlh/using-your-own-forks-with-composer-699358db05d9

需求

PHP >= 5.6.40
ext-json

安装

composer require louislee1021/presento dev-master

功能

  1. Presenter::present() 只展示必要的字段。

present() 返回的数组中,

  1. Presenter::present() 键别名: 'user_id => id' 返回新的名称 user_id

  2. 深度遍历:在 projects 数组上 'top_package' => 'projects.0.name'

  3. 嵌套展示器: 'projects' => [ProjectPresenter::class => ['projects']],

  4. 数据表格式,数组键移除。在 Presenter 类中,添加此属性
    protected $formatDatatables = true;

  5. 简单的转换器覆盖在 user_id => id
    public function getUserIdProperty($value)

  6. 读取多记录 protected $multi = true;

// UserTransformer.php
class UserTransformer extends \Louis1021\Presento\Transformer
{
    public function getUserIdProperty($value)
    {
        return md5($value);
    }
}

// UserPresenter.php
class UserPresenter extends \Louis1021\Presento\Presenter
{
    public function present()
    {
        return [
            'user_id' => 'id',
            'name',
            'email',
            'type',
            'is_active',
        ];
    }

    public function transformer()
    {
        return UserTransformer::class;
    }
}

为什么选择 Presento?

Presento 是一个简单但强大的数据准备和展示工具。当我们构建基于 API 的应用程序时,我们需要在通过响应 展示 之前先 转换 数据。此包将使这项任务对您来说更加简单。

还不够清楚吗?

别担心,您将从 使用示例 中获得更好的理解。

用法

Presento 承担两个重要的目的。一个是 展示,另一个是数据的 转换

让我们看看一些示例来了解如何使用它。

我们将使用以下数据集来展示示例。假设我们已从这个数据源获取了数据,并在将其发送到响应之前需要对其进行一些转换或修改。

$response = [
    "id" => 123456,
    "name" => "Nahid Bin Azhar",
    "email" => "talk@nahid.im",
    "type" => 1,
    "is_active" => 1,
    "created_at" => "2018-01-02 02:03:04",
    "updated_at" => "2018-01-02 02:03:04",
    "deleted_at" => "2018-01-02 02:03:04",
    "projects" => [
        [
            "id" => 1,
            "name" => "Laravel Talk",
            "url"   => "https://github.com/nahid/talk",
            "license" => "CC0",
            "created_at" => "2016-02-02 02:03:04"
        ],
        [
            "id" => 2,
            "name" => "JsonQ",
            "url"   => "https://github.com/nahid/jsonq",
            "license" => "MIT",
            "created_at" => "2018-01-02 02:03:04"
        ]
    ]
];

简单的展示示例

在将此数据发送到 API 响应时,我们只想发送 idnameemailtypeis_activeprojects

我们可以通过为以下内容准备一个展示器来简单地做到这一点。

// UserPresenter.php

class UserPresenter extends \Louis1021\Presento\Presenter
{
    public function present()
    {
        return [
            'id',
            'name',
            'email',
            'type',
            'is_active',
            'projects',
        ];
    }
}

您可能已经猜到了如何使用它,对吧?

$user = new UserPresenter($response);
dump($user->get());

它将显示类似以下内容

[
    "id" => 123456,
    "name" => "Nahid Bin Azhar",
    "email" => "talk@nahid.im",
    "type" => 1,
    "is_active" => 1,
    "projects" => [
        [
            "id" => 1,
            "name" => "Laravel Talk",
            "url"   => "https://github.com/nahid/talk",
            "license" => "CC0",
            "created_at" => "2016-02-02 02:03:04"
        ],
        [
            "id" => 2,
            "name" => "JsonQ",
            "url"   => "https://github.com/nahid/jsonq",
            "license" => "MIT",
            "created_at" => "2018-01-02 02:03:04"
        ]
    ]
]

非常简单,对吧?

展示示例中的 'key' 别名

假设您想将一些 'key' 改为不同的名称,例如将 id 键更改为 user_id 。您该如何做呢?

只需做以下操作。

// UserPresenter.php
class UserPresenter extends \Louis1021\Presento\Presenter
{
    public function present()
    {
        return [
            'user_id' => 'id',
            'name',
            'email',
            'type',
            'is_active',
        ];
    }
}

这将按以下方式格式化数据

[
    "user_id" => 123456,
    "name" => "Nahid Bin Azhar",
    "email" => "talk@nahid.im",
    "type" => 1,
    "is_active" => 1,
]

展示示例中的深度遍历

您可以通过使用 . (点) 表示法轻松地深入嵌套层级并获取数据。

假设您想显示第一个包的 name 作为您的数据中的 top_package

这就是您如何做到这一点的方法。

// UserPresenter.php
class UserPresenter extends \Louis1021\Presento\Presenter
{
    public function present()
    {
        return [
            'id',
            'name',
            'email',
            'type',
            'is_active',
            'top_package' => 'projects.0.name',
            'projects',
        ];
    }
}

这将按如下方式格式化数据

[
    "id" => 123456,
    "name" => "Nahid Bin Azhar",
    "email" => "talk@nahid.im",
    "type" => 1,
    "is_active" => 1,
    "top_package" => "Laravel Talk",
    "projects" => [
        [
            "id" => 1,
            "name" => "Laravel Talk",
            "url"   => "https://github.com/nahid/talk",
            "license" => "CC0",
            "created_at" => "2016-02-02 02:03:04"
        ],
        [
            "id" => 2,
            "name" => "JsonQ",
            "url"   => "https://github.com/nahid/jsonq",
            "license" => "MIT",
            "created_at" => "2018-01-02 02:03:04"
        ]
    ]
]

注意数据中的 top_package 键。

简单转换器示例

假设我们的 UserPresenter 是这样的

// UserPresenter.php
class UserPresenter extends \Louis1021\Presento\Presenter
{
    public function present()
    {
        return [
            'user_id' => 'id',
            'name',
            'email',
            'type',
            'is_active',
        ];
    }
}

而我们想以 hashed 值的形式显示 user_id,而不是数据库中作为增量整数的值。这意味着我们想要转换 user_id

为此,我们需要创建一个像这样的转换器类

// UserTransformer.php
class UserTransformer extends \Louis1021\Presento\Transformer
{
    public function getUserIdProperty($value)
    {
        return md5($value);
    }
}

请注意,由于我们将转换 user_id 属性,因此我们将转换器方法命名为 getUserIdProperty。因此,如果您还想转换 name 属性,只需在这个类中创建另一个名为 getNameProperty 的方法,并在其中添加转换逻辑。

现在,我们需要让 演示者 知道在展示之前如何 转换 数据。

为此,我们需要在 UserPresenter 类中添加以下方法。

// UserPresenter.php
public function transformer()
{
    return UserTransformer::class;
}

所以,我们的最终输出将是

[
    "user_id" => "e10adc3949ba59abbe56e057f20f883e",
    "name" => "Nahid Bin Azhar",
    "email" => "talk@nahid.im",
    "type" => 1,
    "is_active" => 1,
]

这不简单吗,伙计?

嵌套演示者示例

您可能会注意到我们的数据集中有一个 projects 集合。如果每个 project 是一个单独的资源,您可能需要一个单独的演示者来处理它。就像这样

// ProjectPresenter.php
class ProjectPresenter extends \Louis1021\Presento\Presenter
{
    public function present()
    {
        return [
            'id',
            'name',
            'url',
            'license',
            'created_at',
        ];
    }

    public function transformer()
    {
        return ProjectTransformer::class;
    }
}

您能否使用这个演示者为 Users 数据中的每个 projects 使用它?

当然可以!只需这样做

// UserPresenter.php
public function present()
{
    return [
        'user_id' => 'id',
        'name',
        'email',
        'type',
        'is_active',
        'projects' => [ProjectPresenter::class => ['projects']],
    ];
}

现在,Usersprojects 列表中的每个 project 都将按照 ProjectPresenter 中定义的方式进行展示。

基本数据格式转换示例

正如您所看到的,我们到目前为止使用的数据集是一个普通的 数组。但有时情况可能并非如此。您可能需要处理不同的事物,例如 Laravel 框架的 Eloquent Model。在这种情况下,您可以在您的 演示者 中简单地添加一个名为 convert 的方法,以将基本数据转换为数组格式。

让我们看看一个示例

// UserPresenter.php
public function convert($data)
{
    if ($data instanceof Model) {
        return $data->toArray();
    }

    return $data;
}

就这样。