halaei/presenter

此包已废弃,不再维护。未建议替代包。
此包最新版本(1.0.0)的许可证信息不可用。

eloquent 的 presenter

1.0.0 2014-11-06 12:28 UTC

This package is auto-updated.

Last update: 2022-02-01 12:38:26 UTC


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;

请随意使用最适合您情况的任何子集功能和选项。