大麻 / presenter
Laravel中的简易模型展示器
Requires (Dev)
- mockery/mockery: ^1.0
- orchestra/database: ^6.19|^7.0|^8.0
- orchestra/testbench: ^6.19|^7.0|^8.0
- phpunit/phpunit: ^9.5.10
README
此包可让您快速、有趣且有利可图地装饰Eloquent模型以在视图中展示,PDF文件中,CSV文件中或项目中的任何其他地方。
有关展示器解决的问题的简要介绍,请参阅此文章:Laravel中的展示器。
安装
通过 Composer 安装包
composer require hemp/presenter
Laravel 5.5+ 中,包的服务提供者应该会自动发现,因此您不需要注册它。如果出于某种原因您需要手动注册它,可以将它添加到 config/app.php
中的 providers
数组中
'providers' => [ // ... Hemp\Presenter\PresenterServiceProvider::class, ],
创建 Presenter
类
您可以通过调用 make:presenter
Artisan 命令轻松生成一个 Presenter
类
php artisan make:presenter ApiPresenter
这将生成一个空的 Presenter
类在 app/Presenters
中。
自定义 Presenter
类
在核心上,展示器是简单的类,旨在封装复杂或重复的视图逻辑。使 hemp/presenter
友好的是,它允许您将这些 Presenter
对象附加到魔法访问器,同时允许使用常规 Model
对象和集合的典型序列化工作流程。例如,考虑这个 ApiPresenter
类
<?php namespace App\Presenters; use Hemp\Presenter\Presenter; class ApiPresenter extends Presenter { public function createdDate() { return $this->created_at->format('n/j/Y'); } public function getFullNameAttribute() { return trim($this->first_name . ' ' . $this->last_name); } }
此类有一个自定义方法 createdDate
,可以在使用此 Presenter
的任何地方调用。它还有一个魔法访问器 getFullNameAttribute
,可以通过 Presenter
访问,如下所示:$user->full_name
。这与Eloquent的魔法访问器的工作方式完全一样...当 Presenter
转换为响应(如视图或API响应)时,这些魔法访问器将被调用并添加到渲染输出中。
您会注意到我们调用了 $this->first_name
和 $this->last_name
。这些不是在 Presenter
类本身上可用的,但被委托给底层的 Model
实例。
此 Presenter
可能会输出如下内容
{ id: 1, first_name: 'David', last_name: 'Hemphill', created_at: '2016-10-14 12:00:00', updated_at: '2016-12-14 12:00:00', full_name: 'David Hemphill', // The magic accessor }
一旦您有一个展示的模型实例(如Blade视图中),您可以使用魔法访问器如下所示
$presentedUser->full_name;
或使用 Presenter
自身上可用的方法
$presentedUser->createdAt();
当将 Presenter
输出到 array
或 JSON 时,如果您希望每个渲染属性都使用 camelCase
格式而不是默认的 snake_case
格式,可以将您的 Presenter
上的 snakeCase
属性设置为 false
class ApiPresenter extends Presenter { public $snakeCase = false; }
这将导致渲染输出看起来像这样
{ "id": 1, "firstName": "David", "lastName": "Hemphill", "createdAt": "2016-10-14 12:00:00", "updatedAt": "2016-12-14 12:00:00", "fullName": "David Hemphill" }
如果您的前端JavaScript样式指南主要使用camelCased变量,您可能喜欢此选项。
此外,您可以使用 snakeCase
和 camelCase
设置器在运行时设置使用的策略
Presenter::make($user, ApiPresenter::class)->snakeCase(); Presenter::make($user, ApiPresenter::class)->camelCase();
展示单个模型
您可以根据个人喜好以多种不同的方式展示您的 Model
对象。例如,您可以使用 Presenter
类的 make
工厂方法
$user = User::first(); $presentedUser = Presenter::make($user, ApiPresenter::class);
您还可以在您的任何自定义 Presenter
类上调用 make
方法,而不传递第二个参数
$user = User::first(); $presentedUser = ApiPresenter::make($user);
如果您喜欢,也可以使用 present
全局函数
$user = User::first(); $presentedUser = present($user, ApiPresenter::class);
或者您可以在您的 Model
上使用 Hemp\Presenter\Presentable
trait。这将允许您直接调用其上的 present
方法
use Hemp\Presenter\Presentable; class User extends \Illuminate\Database\Eloquent\Model { use Presentable; } $presentedUser = User::first()->present(ApiPresenter::class);
此外,在使用 Presentable
trait 时,您可以在 Model
上使用 defaultPresenter
属性来指定默认的展示器,然后调用 present
use Hemp\Presenter\Presentable; class User extends \Illuminate\Database\Eloquent\Model { use Presentable; public $defaultPresenter = App\Presenters\ApiPresenter::class; } $presentedUser = User::first()->present();
展示集合
您还可以创建一个展示过的 Model
对象集合。一种方法是在 Presenter
类上使用静态的 collection
方法来展示一个 Model
对象数组
$users = User::all(); $presenter = Presenter::collection($users, ApiPresenter::class);
您还可以直接在您的任何自定义 Presenter
类上使用静态的 collection
方法,而不需要传递第二个参数
$users = User::all(); $presenter = ApiPresenter::collection($users);
您还可以在集合对象上使用 present
宏
$presentedUsers = User::all()->present(ApiPresenter::class);
从输出中隐藏模型属性
有时您可能希望某些键不被渲染在您的 Presenter
中。您可以使用 Presenter
上的 hidden
属性来防止任何默认的 Model
属性被用于输出
<?php namespace App\Presenters; use Hemp\Presenter\Presenter; class ApiPresenter extends Presenter { protected $hidden = ['stripe_private_key']; }
这将防止最终输出中显示底层 Model
实例的 stripe_private_key
属性。
您还可以在 Presenter
上指定 visible
属性,将其作为应该显示在输出中的属性的允许列表。
<?php namespace App\Presenters; use Hemp\Presenter\Presenter; class ApiPresenter extends Presenter { protected $visible = ['name', 'email']; }
注意:如果键同时指定在 hidden
和 visible
属性中,那么它将被假设您希望它在渲染的输出中是可见的。
支持
如果您使用这个包,我很乐意了解!
如果您在使用这个包时遇到问题,请在 Twitter 上联系我。我会很乐意帮助。
如果您认为您已经发现了一个错误、改进或其他问题,请使用 GitHub 问题跟踪器 报告它,或者分支仓库并提交一个 pull request。