2

我对 MVC 相当陌生,来自 php 背景,当我需要登录表单之类的东西时,我通过视图设计并创建页面。我会有一个名为 login 的文件。只有当我需要一个新的登录表单来登录不同类型的用户时,这才很糟糕。说管理员。然后,我必须创建一个名为 login-admin.php 或类似性质的新页面。

最近我开始探索 MVC,尤其是框架,我遇到的最大问题是确定你的控制器到底是如何设计的。我被告知要么为每个视图文件路由使用一个控制器,要么根据您的域对象获取控制器。

我知道我可以有一个用户控制器和很多方法来操作该对象,比如用户/添加、用户/编辑、用户/删除、用户/配置文件。但是在这种情况下,似乎一旦您需要不一定适合“域对象”的视图,就很难决定将它们粘贴在哪里。

那么,在确定您的控制器将是什么时,最佳实践是什么?

4

4 回答 4

3

我为每个“关注区域”使用一个控制器。这有点随意,通常是一个稍大的类别,基于域模型,包括多个对象。

换句话说,假设在您的域模型中,您将安全作为您关注的领域之一。它可能涉及许多视图和许多域对象,但我会将其设为一个控制器,处理所有与安全相关的操作。

于 2008-10-08T22:09:36.393 回答
2

使用 Ruby on Rails(以及更多其他 MVC Web 框架),控制器通过某种路由配置映射到 URL。

例如, /mysection/view/2 通常映射到controller = mysection, method = viewid = 2在 Rails 中,这是默认映射,在 ./config/routes.rb: 中map.connect ':controller/:action/:id'

当你说你有“一个用户控制器和很多操作该对象的方法说用户/添加、用户/编辑、用户/删除、用户/配置文件”时,我认为你的意思是一个模型 - 所以你会有 UserModel.create (), UserModel.find() 等。然后控制器将使用模型来编辑数据 - 实际的控制器应该只有几行代码调用模型(例如@myuser = User.find(id)),以及映射到 URL 的一些方法(比如说/usercontroller/new, /usercontroller/edit, /usercontroller/view

该描述是相当特定于 Rails 的,但大多数 PHP 框架将非常相似——我知道 CodeIgniter 使用几乎相同的布局。

于 2008-10-08T22:17:12.417 回答
1

在创建控制器时,我通常会考虑用户看到了什么,以及什么对用户来说是直观的,因为控制器被映射到 URL。

在您的示例中,如您所说,让所有与用户相关的页面具有 /user/edit、/user/profile 等格式是有意义的。但是,如果我是你,我不会有单独的管理员登录页面,我会使用相同的登录视图,并在其他地方处理管理位。

简而言之,通常我为用户在使用网站时会想到的每个关键概念制作一个控制器。因此,如果网站上的用户可以添加/删除朋友,我会认为这是一个独立的概念(而不是用户概念的一部分)。所以我会有一个朋友控制器,具有朋友/添加、朋友/列表、朋友/删除等功能。

于 2008-10-08T22:39:10.250 回答
0

控制器更像是触发调用的一段代码。在封装良好的代码中,修改模型的方法出现在模型附近(在同一个域对象中)。然而,调用点是分开的(不是同一个域对象的一部分)。

一些框架,如 struts,提供可配置的控制器(使用 xml)。还有一个前端控制器的概念,其中通用控制器充当顶级委托人。我们可以使用这个前端控制器来处理琐碎的映射(不严格处理域)。

于 2008-10-08T22:17:19.250 回答