frostealth/php-presenter

简单视图展示器

v0.1.1 2015-12-14 11:47 UTC

This package is not auto-updated.

Last update: 2024-09-14 18:28:22 UTC


README

您会遇到一些情况,需要在某些数据(可能是从您的实体中获取)在视图中显示之前执行一些逻辑。

  • 这个逻辑应该直接硬编码在视图中吗? 不。
  • 我们应该把逻辑存储在模型中吗? 不,再次不!

相反,利用视图展示器。这正是它们存在的意义!本软件包提供了一种实现方式。

安装

运行Composer命令以安装最新稳定版本

composer require frostealth/php-presenter @stable

使用方法

第一步是将您的展示器存储在某个地方——任何地方。这些将是非常简单的对象,它们除了格式化数据外不做任何事情。

这里是一个展示器的示例。

namespace app\presenters;

use frostealth\presenter\Presenter;

/**
 * Class ConcreteEntityPresenter
 *
 * @property-read string $fullName
 * @property-read string $birthDate
 */
class ConcreteModelPresenter extends Presenter
{
    /**
     * @return string
     */
    public function getFullName()
    {
        return implode(' ', [$this->firstName, $this->lastName]);
    }
    
    /**
     * @return string
     */
    public function getBirthDate()
    {
        return date('y.M.d', $this->entity->birthDate);
    }
}

这里是一个可展示的模型示例。

namespace app\models;

use app\presenters\ConcreteModelPresenter;
use frostealth\presenter\interfaces\PresentableInterface;

class ConcreteModel implements PresentableInterface
{
    /** @var string */
    public $firstName;
    
    /** @var string */
    public $lastName;
    
    /** @var string */
    public $birthDate;
    
    /** @var ConcreteModelPresenter */
    protected $presenter;

    /**
     * @return ConcreteModelPresenter
     */
    public function presenter()
    {
        if ($this->presenter === null) {
            $this->presenter = new ConcreteModelPresenter($this);
        }
    
        return $this->presenter;
    }
}

现在,在您的视图中,您可以这样做

<dl>
    <dt>Name</dt>
    <dd><?= $model->presenter()->fullName ?></dd>
    
    <dt>Birth Date</dt>
    <dd><?= $model->presenter()->birthDate ?></dd>
</dl>

许可证

MIT许可证(MIT)。有关更多信息,请参阅LICENSE.md