-1

我远不是 MVC V 领域的专家,最近一直在尝试不同的 View,我目前正在尝试的可能甚至不是一个正确的 View,它只是我想出来的。

在我的应用程序中,aCustomer可以将Request(交付请求)发送到Courier. 有Request4 个状态:

  1. 发送
  2. 取消
  3. 被拒绝
  4. 公认

我有一个RequestView扩展我的View. 我将一个Request实体注入到我RequestView的构造中,并根据它所处的状态Request选择RequestView适当的模板。

RequestView有一些方法,例如:

protected function getStateText() {

    switch( $this->request->getState() ) {
    case Request::STATE_SENT:
        return 'Sent';
    case Request::STATE_CANCELLED:
        return 'Cancelled';
    case Request::STATE_REJECTED:
        return 'Rejected';
    case Request::STATE_ACCEPTED:
        return 'Accepted';
    default:
        return 'Error';
    }
}

然后我可以通过调用在我的模板中使用它

echo $this->getStateText();

Request实体中,我只使用 INTEGER 处理状态,当我在表示层时,没有人希望以数字格式查看状态,他们希望以文本形式查看当前状态,这就是为什么我getStateText()在表示层而不是实体本身。我的想法/推理在这里正确吗?

我目前的实施是好是坏?这种类型的视图有名称吗?

谢谢。

4

2 回答 2

1

首先,为什么$this模板内会指向一个视图?再说一次,当我使用“模板”这个词时,我的意思是这样的。

另外,我Request对视图中注入实例背后的原因感到很困惑。如果视图需要来自模型层的数据,它应该只查询它以获取所述数据。然后,如果您在该视图中有一些共享的可视化逻辑,您可以简单地将其隔离到适当的表示对象

这些表示对象(Fowler 称它们为“表示模型”,我发现这只会增加混乱)然后可以用来生成值,这些值可以应用于模板。

而这一切都与 MVVM 无关。ViewModel 是您在该模式中使用的,当您换出 Controller 时。这通常不会触及视图。此外,MVVM 模式比其他任何模式都更接近MVP 。如果你添加 MVP、监督控制器、页面控制器,然后让崇拜 Rails 的人来改变它,这就是你会得到的。

至于您目前拥有的命名,不幸的是,我只是将其标记为“违反SRP ”并继续戳它。

my 2 cents

于 2013-07-15T22:24:16.477 回答
0

这种类型的视图有名称吗?

您正在尝试使用 MVVM(模型-视图-视图模型)。

我目前的实施是好是坏?

根据您所展示的内容,我认为就关注点分离而言,您正朝着正确的方向前进,所以我会说您做得很好。

我会做的一件事是将getStateText逻辑隐藏在另一个类中(例如RequestStateToTextTransformer=>transformreverseTransform方法)。

为什么?好吧,也许您想在其他地方以不同的格式显示 Request 实体。您当前必须getStateText在不同的 ViewModel 中复制代码。有了变压器,就没有重复了。

于 2013-07-15T21:38:01.590 回答