rawebone/view-model

此包最新版本(v0.1.0)没有可用的许可证信息。

该库提供了一种面向视图层的MVVM方法,强调可测试性和文档。

v0.1.0 2014-01-05 00:20 UTC

This package is not auto-updated.

Last update: 2024-09-24 00:37:28 UTC


README

Build Status

视图模型提供了一个在模型、在域层中持有数据的结构,以及视图之间的抽象,视图是将数据插入用户界面的混合。这种抽象的存在是为了减少标记UI所需的逻辑量,并允许在不比较整个输出标记的情况下测试核心呈现逻辑。此外,如果您的模板系统更改,迁移逻辑应该非常简单。

该库提供

  • MVVM模式的简单实现
  • 适用于多个模板引擎的适配器
  • 一个文档化视图模型的系统,以便将信息传递给设计师/产品经理

用法

视图模型

视图模型由一个定义逻辑的类和一个定义输出标记的模板组成

<?php
namespace My\App\Views;

// src/My/App/Views/Model.php

use Rawebone\ViewModel\AbstractViewModel;

class Model extends AbstractViewModel
{
    // Define your logic/constructors here

    public function name()
    {
        return "John";
    }
}
<?php

// src/My/App/Views/Model.view.php

echo $model->name() . "\n";

引擎

该库默认支持多个模板系统

  • Rawebone\ViewModels\Engines\BasicPhpEngine
  • Rawebone\ViewModels\Engines\MustacheEngine
  • Rawebone\ViewModels\Engines\PhlyMustacheEngine
  • Rawebone\ViewModels\Engines\TwigEngine

引擎的用法相当简单

$engine = new \Rawebone\ViewModel\Engine\BasicPhpEngine();
echo $engine->render(new \My\Project\Views\Model()); // John

根据惯例,所有引擎适配器都会在其上下文中公开一个名为"model"的单个变量。此外,每个引擎都会将其特定的文件扩展名附加到由ViewModel提供的文件名上(例如,".twig",".php")。

TwigEngineMustacheEnginePhlyMustacheEngine都接受两个构造函数参数,第一个是封装的引擎,第二个是一个布尔值,指定是否应传递文件或传递文件的内容。

文档

您可能会与不了解应用程序内部结构的团队合作,或者想知道模板可以消费哪些数据。该库提供了一个工具,可以轻松地记录系统中的视图模型,以便您可以以所需的任何格式输出信息。

$meta = new \Rawebone\ViewModel\MetaData\Providers\ZeptechMetaDataProvider():

$model = $meta->collateFor(new \My\Project\Views\Model());

foreach ($model as $exposed) {
    echo "Type: " . ($exposed->isProperty() ? "Property" : "Method") . "\n" .
         "Name: " . $exposed->name() . "\n" . 
         "Returns:" . $exposed->returnType() . "\n" .
         "Example: " . $exposed->example() . "\n";
}

然后可以按如下方式注解模型

namespace My\Project\Views;

use Rawebone\ViewModel\AbstractViewModel;

class Model extends AbstractViewModel
{
    /**
     * @vmExpose
     * @vmReturn string
     * @vmExample JOHN
     */
    public $upper;

    /**
     * @vmExpose
     * @vmReturn string
     * @vmExample John
     */
    public function name()
    {
        return "John";
    }
}