0

在“通用”应用程序中,控制器将ViewModel对象中的数据转发到视图。在那里可以为输出进行准备,例如

 `id`                       -> `/foo/bar/` . `$course->id`                  -> `link`
 `firstname` and `lastname` -> `$course->name`                              -> `name`
 `date`                     -> `AgeHelper(`$course->date`)` . ' years old.' -> `age`
 etc. ...

现在我正在开发一个 RESTful 应用程序并且缺少这个视图级别。它目前的工作方式如下:

控制器

public function get($id)
{
    $course = $this->getCourseTable()->findOnceByID($id)->current();
    $viewModel = $this->acceptableViewModelSelector($this->acceptCriteria);
    $viewModel->setVariables(array('data' => array(
        'id'             => $course->id,
        'created_at'     => $course->created_at,
        'details'        => $course->details,
    )));
    return $viewModel;
}

但这仅适用于浅层数据结构。应该在哪里处理/准备数据ViewModel

  • 控制器?不,不在控制器中。
  • 模型?不在模型表或映射器类中。
  • 看法?会很好,但没有意见。

那么,在哪里?

谢谢

4

1 回答 1

2

与渲染 HTML 相比,JSON 主要用于传输原始数据,在 HTML 中以视图脚本的形式拥有这个额外的“表示”层是有意义的。查看您的代码,您似乎正在使用表网关模式来检索实体。因此,我相信您在这里有以下选择:

  • 返回 JsonModel 并仅传递来自行对象的原始数据,并让 JS/其他应用程序根据需要对其进行格式化
  • 返回 JsonModel 并使用一些“帮助” TableGateway 或 RowGateway 方法在控制器中传递预先格式化的数据,或者您可能需要考虑实现一些控制器插件来执行此操作。
  • 返回 JsonModel 并使用您实现的 TableGateway::toJson($row) 或 RowGateway::toJson() 等方法传递格式化数据。
  • 返回 ViewModel 并将您的实体传递给查看脚本,就像使用普通 HTML 模板一样。您可以使用视图助手根据需要格式化输出。然后使用 Zend\View\Helper\Json 视图助手用您的数据设置 'application/json' 响应 --- 注意:看起来 Json 助手不起作用,因为它记录在案,所以直到它被修复或者你用你自己的实现替换它这对你来说不是一个真正的选择:)
于 2013-06-25T13:15:55.860 回答