【问题标题】:Usage of views and templates视图和模板的使用
【发布时间】:2016-09-16 22:55:48
【问题描述】:

目前,模型层的服务部分持有MainService,目标如下

MainService => Communicates with persistence layer,
               does the UI logic,
               renders the respective view

the question here 的 OP 描述了这个想法;视图应该做 UI,然后渲染(依赖)各自的模板。

MainService 的示例类似于

echo $this->factory->template()
    ->file('/path/to/template')
    ->set('url', 'some/url')
    ->render();

这显然与Views 的概念相矛盾。这就是我感到困惑的地方——当前的服务实现看起来很像一个视图。那是风景吗?

【问题讨论】:

  • 该定义似乎将“服务”用于我认为的控制器。如果您查看一些大型“mvc”框架(symfony、laravel)是如何实现 mvc 的,那么您将请求路由到控制器,该控制器接受用户输入并对其进行任何处理,最好使用服务。然后渲染一个视图/模板
  • Afaik,php中的控制器多半是一个服务,是模型层的一部分。
  • 在提到的“mvc”实现中,他们使用日志服务、邮件服务等服务。请注意,我经常使用带引号的“mvc”,因为这种模式只是在一定程度上被实施。它似乎不是一成不变的,而且经常有些固执己见,这种(和其他)模式是如何实现的。如果您对结构/模式的辩论感兴趣,我建议您在codereview.stackexchange.com 发帖
  • 是的,他们使用流行语“mvc”进行营销。此外,提到的帖子的 OP 对此有一些很好的引用。
  • @JimL fyi,这里有另一篇文章:r.je/views-are-not-templates.html

标签: php oop model-view-controller view model


【解决方案1】:

控制器负责:

  • 读取用户输入

  • 向模型请求数据

  • 使用该数据调用视图

模型负责:

  • 从持久层检索数据

  • 按照控制器的要求对数据进行整形

视图负责:

  • 使用控制器提供的数据渲染模板并将其显示给用户

在您的示例中,MainService 与持久层通信是正确的。 但是,做 UI 逻辑和渲染视图(模板)是视图的工作。

如果你使用像 Laravel、Zend、Angular2 这样的框架,你将永远看不到 View 层。您将定义模板,但框架会根据您在 Controller 中提供的数据进行渲染。

使用 Laravel 显示用户个人资料页面的示例流程:

  • Laravel 将根据路由设置(特定控制器的特定 URL 和动作)调用控制器动作

  • 控制器将读取参数(用户 ID)

  • 控制器将从 UserService 请求具有该 ID 的用户

  • 服务将向数据库发出请求并构建将返回给控制器的用户模型(对象)

  • Controller 将使用模板标识符和从 User 对象获取的数据数组调用 View

  • View 将使用数组中的数据呈现模板

【讨论】:

  • 你描述的不是MVC。这只是另一个糟糕的类似 Rails 的框架。
猜你喜欢
  • 2019-03-14
  • 2015-01-15
  • 2012-05-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-04
  • 2013-06-20
  • 1970-01-01
相关资源
最近更新 更多