使用无逻辑模板系统,您将逻辑放在哪里

Where do you put the logic with a Logic-less Template System

所以我有一堆页面,它们使用 ajax 拉入实体并将它们放入带有 Mustache 的 DOM 中。

每个实体都有一个 created_on 字段,它是一个 MySQL 日期时间,但是只有日期时间的字符串表示形式会传递给 Mustache。 我知道 Mustache 是没有逻辑的,但是这个逻辑最合适的地方是什么。

我应该遍历每个实体并将 created_on 字段转换为模型中适当格式的日期,还是有其他更合适的地方?

编辑:

class ExampleController {
    private $dataModel;
    private $presenter;

    public function __construct(
        DataModel $dataModel,
        Presenter $presenter
    ){
        $this->dataModel = $dataModel;
        $this->presenter = $presenter;
    }

    /**
    * Action loads data from model and returns it for Mustache
    *
    */
    public function exampleAction() 
    {
        /**
        * Pull data from database
        */
        $data = $this->dataModel->getData();
        // $data = [// <-- Sample Data
        //  [
        //      'id' => 1,
        //      'created_on' => '2015-01-01 00:00:00'
        //  ],
        //  [
        //      'id' => 2,
        //      'created_on' => '2015-02-03 00:00:00'
        //  ],
        //  [
        //      'id' => 3,
        //      'created_on' => '2015-04-05 00:00:00'
        //  ]
        // ];

        /**
        * Make data presentable
        */
        $presentableData = $this->presenter->makePresentable($data);

        /**
        * Return presentable data for Mustache
        */
        echo json_encode($presentableData);
    }
}

使用无逻辑模板语言,您可以将逻辑转移到代码中。放置它的地方之一是控制器,但这确实不是最好的。

最好将您的视图视为由两部分组成:一部分模板和一部分代码。您可以将此代码称为 ViewModel 或 Presenter,或者您甚至可以将其称为 View,因为一旦您这样做,模板本身就是 View 通常完成的最不有趣的部分。

然后,控制器负责处理请求的 "action" 位,加载域模型并将所有内容传递给 View(s)/ViewModel(s)/Presenter(s)渲染。

以下是这种方法的几个示例:

Mustache.php : Idiomatic ways to template select dropdowns

https://gist.github.com/bobthecow/61161639d8be82a75b5e