DavidIanBonner / presenter
Laravel 的展示器(presenter)和转换器(transformer)包。
Requires
- php: ^7.0
- illuminate/contracts: ^6.0
- illuminate/support: ^6.0
Requires (Dev)
- mockery/mockery: ^1.0
- orchestra/testbench: ^4.0
- phpunit/phpunit: ^8.0
README
这是一个用于 Laravel 应用的简单数据展示器/转换器,可用于视图和 JSON。
在大多数情况下,通过 REST API 输出 JSON 所需的数据转换与我们在视图中需要的数据相同。这个包可以防止使用转换器来处理 JSON(例如使用 Fractal – 对于大型应用程序和复杂转换来说非常棒)和属性修改器。无论是返回视图还是 JSON,数据都可以使用一个类来展示和转换。
安装
通过 Composer 安装包
composer require davidianbonner/presenter
Laravel 5.5+ 使用包自动发现功能,不需要您手动添加 ServiceProvider。但是,如果您正在使用 5.4 或更早版本,请将包服务提供者在 config/app.php
的 providers
数组中添加。
DavidIanBonner\Presenter\PresenterServiceProvider::class
在 config/app.php
的 aliases
中添加 facade
'Presenter' => DavidIanBonner\Presenter\Facades\Presenter::class,
然后发布配置文件
php artisan vendor:publish --provider="DavidIanBonner\Presenter\PresenterServiceProvider"
工作原理
只有在对象实现了 Presentable
接口时,才会执行 '转换'。
如果可展示的对象是一个 Eloquent 模型,展示器将检查已加载的关系,并尝试转换它们,用转换器对象替换现有关系。
展示/转换对象
转换时,对象将被注入到一个转换器类中,这将让您有权访问魔法方法、对象的魔法获取器以及自动的 toArray
和 toJson
输出。
// 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
方法将调用 toArray
和 json_encode
。toArray
将尝试收集传递给它的 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 获取更多信息。