louis1021 / presento
Presento 是一个用于 PHP 5.6.40 数据展示器的包
Requires
- php: >=7.0
- ext-json: *
Requires (Dev)
- phpunit/phpunit: ^7
- symfony/var-dumper: 4.4.x-dev
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
功能
Presenter::present()只展示必要的字段。
在 present() 返回的数组中,
-
Presenter::present()键别名:'user_id => id'返回新的名称user_id -
深度遍历:在
projects数组上'top_package' => 'projects.0.name' -
嵌套展示器:
'projects' => [ProjectPresenter::class => ['projects']], -
数据表格式,数组键移除。在 Presenter 类中,添加此属性
protected $formatDatatables = true; -
简单的转换器覆盖在
user_id => id
public function getUserIdProperty($value) -
读取多记录
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 响应时,我们只想发送 id、name、email、type、is_active 和 projects。
我们可以通过为以下内容准备一个展示器来简单地做到这一点。
// 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']], ]; }
现在,Users 中 projects 列表中的每个 project 都将按照 ProjectPresenter 中定义的方式进行展示。
基本数据格式转换示例
正如您所看到的,我们到目前为止使用的数据集是一个普通的 数组。但有时情况可能并非如此。您可能需要处理不同的事物,例如 Laravel 框架的 Eloquent Model。在这种情况下,您可以在您的 演示者 中简单地添加一个名为 convert 的方法,以将基本数据转换为数组格式。
让我们看看一个示例
// UserPresenter.php public function convert($data) { if ($data instanceof Model) { return $data->toArray(); } return $data; }
就这样。