【问题标题】:What type of View am I using in my MVC application? [closed]我在 MVC 应用程序中使用什么类型的视图? [关闭]
【发布时间】:2013-07-13 21:16:31
【问题描述】:

我远不是 MVC 的 V 领域的专家,并且最近一直在尝试不同的 View,我目前正在尝试的可能甚至不是带有名称的正确 View,这只是我想出的东西.

在我的应用程序中,Customer 可以将Request(交付请求)发送到CourierRequest 有 4 个状态:

  1. 已发送
  2. 已取消
  3. 拒绝
  4. 接受

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

我的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() 方法。我的想法/推理在这里正确吗?

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

谢谢。

【问题讨论】:

  • 我从未听说过有特定名称的那种视图。所以你有一个带有方法的 View 对象,然后你将它扩展为另一种视图?你的观点是如何构成的?根据我的经验,视图通常主要留给 HTML 或其他类似结构,并且编码最少。然后视图模板接收它可以使用的变量。因此,我想不是将视图扩展为具有特定结构,而是向视图发送一个对象,该对象将在正确的位置回显 getStateText() 公共函数。当然,这取决于您的整个 MVC 结构。
  • 你可能想在codereview.stackexchange.com 上问这个问题,因为这实际上不是一个特定的编程问题

标签: php oop model-view-controller


【解决方案1】:

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

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

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

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

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

我的 2 美分

【讨论】:

    【解决方案2】:

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

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

    我目前的实施是好是坏?

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

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

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

    【讨论】:

    • 谢谢 我正在考虑如何停止代码重复,但我从未听说过这些转换器。你有什么好的链接可以进一步解释它们吗?
    • 我想到的例子是 Symfony2 数据转换器。看看symfony.com/doc/current/cookbook/form/…上的一个例子
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-29
    • 1970-01-01
    • 2014-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多