halaei / presenter
eloquent 的 presenter
Requires
- php: >=5.4.0
- illuminate/contracts: ~5.0
- illuminate/database: ~5.0
Requires (Dev)
- phpunit/phpunit: ~4.0
README
这是对 laracasts/presenter 的另一种实现,增加了一些功能。本文档的部分内容是复制粘贴的!
简单视图展示者
在您需要执行一些逻辑后再从视图中显示一些数据(可能来自您的实体)的情况下。
- 这些逻辑是否应该硬编码到视图中?不。
- 我们应该将逻辑存储在模型中吗?再次不!
相反,利用视图展示者。这正是它们存在的目的!此包提供了一个这样的实现。
注意:使用存储库模式,此包建议存储库函数应返回展示者而不是模型,并返回展示者集合而不是 eloquent 集合。
#安装
{ "require": { "halaei/presenter": "0.*" } }
使用
第一步是将您的展示者存储在某个地方——任何地方。这些将是非常简单的对象,它们所做的不过是格式化所需的数据。
以下是一个展示者的示例。
use Laracasts\Presenter\Presenter; class UserPresenter extends Presenter { public function fullName() { return $this->first . ' ' . $this->last; } public function accountAge() { return $this->created_at->diffForHumans(); } }
接下来,在您的实体上引入 Halaei\Presenter\PresentableTrait 特性,这将自动实例化您的展示者类。
以下是一个示例——可能是 Laravel 的 User 模型。
<?php use Halaei\Presenter\PresentableTrait; class User extends \Eloquent { use PresentableTrait; protected $presenter_class = 'UserPresenter'; }
这就完了!您已经完成。现在,在您的视图中,您可以这样做
<h1>Hello, {{ $user->present()->fullName }}</h1>
请注意,调用 present() 方法(它将返回您的新或缓存的展示者对象)的好处是,如果您需要修改页面上全名的显示方式,可以清楚地知道您必须去哪里。
新增功能
BasePresenter
如果您想从存储库函数返回模型,但不想让客户端代码这样做
$model->newQuery()->delete(); //delete all the records of table!
那么您可以在模型中使用 PresentableTrait,即使没有设置 $presenter_class。为此目的有一个默认的展示者类:BasePresenter。
function someRepositoryFunction() { return $this->model->where('some condition')->firstOrFail()->present(); }
$presenter_callables
如果您想在您的存储库客户端中获得一些 eloquent 模型的灵活性,但又不想获得太多的灵活性,可以在使用 PresentableTrait 的同时定义 $presenter_callables
use Halaei\Presenter\PresentableTrait; class User extends \Eloquent { use PresentableTrait; protected $presenter_class = 'UserPresenter'; protected $presenter_callables = ['save']; //to make your presenter a real active record! } //client code can do: /** var UserPresenter $presenter **/ $presenter = $your_user_reopsitory->findById(1); $presenter->email = 'john@doe.com'; $presenter->save();
$presenter_friend
如果您想您的存储库能够访问展示的模型,而且您不希望这种访问在其他地方(即 YourRepositoryClass 是您的展示者的 C++ 朋友)发生,请这样做
class User extends \Eloquent { use PresentableTrait; protected $presenter_class = 'UserPresenter'; protected $presenter_friend = 'YourRepositoryClass'; ... } class YourRepositoryClass() { function save(UserPresenter $user) { //you can do $user->save(); //or equivalently $user->getModel()->save(); //but that can be done only in this friend class! Outsiders will be blocked by an Exection! } }
PresenterCollection
4- 而不是返回 eloquent 集合,eloquent 集合基本上是一个 eloquent 模型的数组,只需将此集合包装在 Halaei\Presenter\PresenterCollection 中即可
use Halaei\Presenter\PresenterCollection; ... function anotherRepositoryFunction() { return new PresenterCollection($this->model->where('some condition')->get()); }
总结
您可以定义这三个特殊变量为静态或非静态,但这不是强制性的,取决于您认为哪种方式更好。
$presenter_class; $presenter_callables; $presenter_friend;
请随意使用最适合您情况的任何子集功能和选项。