【问题标题】:Concern of Separations in MVCMVC 中的分离问题
【发布时间】:2015-11-28 11:32:18
【问题描述】:

大家都说控制器是应用流,模型是业务逻辑,视图是输出。

我可以理解所有模板(电子邮件模板、网站模板、短信模板、ajax 的 JSON 等)都属于 View。此外,检查用户权限(例如在管理页面中)、路由请求等属于控制器。像保存/检索/删除数据库数据这样的动作属于模型。最后,ViewModel 是视图调用的类,用于从模型和虚拟机中获取数据,然后转到视图、模型和控制器旁边的文件夹。

但是我应该把 Autoloader、Configuration、SendMail、SendSms、ReadMail、ReadSms、Auth、Request、Hash、Encryption、Validator、SessionHandler、ErrorHandler、CacheHandler、Notification、Chat、DB Migration 等类放在哪里?

我正在寻找终极指南:如何检测 foo 类属于 M、V、C 或 VM,以及将其放在哪个文件夹/命名空间中?

附:我只是在寻找与技术无关的标准。无论 Laravel 或 ZF 或任何其他框架如何实现 MVC。

谢谢。

【问题讨论】:

  • MVC 是一种用户交互模型,并不意味着应用程序中的每个类都属于 MVC。
  • 谢谢@dmitry,您是说这些类应该放在一个单独的文件夹/命名空间中,例如实用程序\Autoloader{},该实用程序与 M、V、C 和 VM 位于相同的命名空间级别/文件夹中?
  • 我的意思是你可能有任何数量的其他代码实体,而不是你可以适应 MVC 的任何东西。例如,Autoloader - 它对 MVC 有什么作用?没什么,它加载类,这纯粹是与 MVC 架构本身无关的低级任务。您在问题中提供的大多数课程都是如此。它们完全可以进入单独的文件夹和命名空间,但不一定。特定的命名和文件布局选择取决于许多问题,但我的主要信息是:应用程序中的任何类都不是 MVC 设计的一部分。

标签: php asp.net-mvc model-view-controller separation-of-concerns


【解决方案1】:

首先,如果不指定您使用的是哪个框架,您不能直接回答这个问题。尽管 MVC 在每个框架上的概念几乎相同,但框架实现有一定的差异。

假设您正在使用 Laravel,在这种情况下,您的路由先决条件作为权限甚至是否登录都将在必须在 routes.php 文件中满足的中间件中实现。

Laravel 将模型视为实现 CRUD 操作的地方,但是您缺少模型中可能没有的业务逻辑,您也不想在控制器中使用它。在这种情况下,您可以创建一个单独的上下文,一个目录,您可以在其中存储类以及跨多个控制器使用的代码。

我想说,即使你对 MVC 模式有充分的了解,你也需要决定和研究要使用的框架。将这 2 部分放在一起,将阐明在哪里放置每一段代码。

【讨论】:

  • 谢谢你的回答,我想为我的博客和未来的项目创建一个小框架,我只是想知道如何分离这些类。
  • 如果它是您自己的框架,我的建议是将类作为您所有可重用功能的单独容器,而不是完全控制器方法。大多数时候,控制器方法要么是路由调用的入口点,要么是方法内的辅助功能。如果代码要被多个控制器使用,它闻起来就像一个单独的类。
  • 感谢您的解释,所以我必须将这些类保存在单独的命名空间/文件夹中,例如实用程序\Autoloader,该实用程序是与 M、V、C 和 VM 级别相同的文件夹/命名空间,是吗?正确的?可以将仅由框架本身使用的 Autoloader 和程序员使用的 SendMail 等类放在同一命名空间/文件夹中吗?
  • 另外,你能告诉我,保存/检索数据但不适用于数据库的类,例如从远程 url、UserUpload、File、Directory 上传/下载的类,等属于\Model 或\utility?网络上的很多资源都说它是\Model,还有很多人说它是\utility。
  • 大卫,你是绝对正确的,我想说你不需要自动加载大多数类。您将根据需要在某些控制器中使用它们。您所需要的只是一个定义良好的路径或命名空间来定位它们,并且某些类可能需要静态方法来自我实例化。一个很好的例子是带有 is_logged 方法的用户类。
猜你喜欢
  • 2017-02-17
  • 2011-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多