我是一个相当新的MVC来自php背景,我在那里设计了视图并在我需要像登录表单这样的东西时创建了页面。我有一个名为login的文件。当我需要一个新的登录表单来登录不同类型的用户时,这只会被吸引。说管理员。然后,我必须创建一个名为login-admin.php的新页面或类似的东西。
最近我开始探索MVC,特别是框架,我遇到的最大问题是确定你如何确定你的控制器。我被告知要么按照每个视图文件路径运行一个控制器,要么根据域对象获取控制器。
我知道我可以拥有一个用户控制器和很多方法来操作该对象,例如用户/添加,用户/编辑,用户/删除,用户/配置文件。但在这种情况下,似乎一旦你需要的视图不一定适合“域对象”,就很难决定把它们放在哪里。
那么,确定控制器的最佳做法是什么?
答案 0 :(得分:3)
我每个“关注区域”使用一个控制器。这是一种任意的,通常是一个稍大的类别,基于域模型,包括多个对象。
换句话说,假设在您的域模型中,您将安全性作为您关注的领域之一。它可能涉及许多视图和许多域对象,但我会将其作为单个控制器,它处理所有与安全相关的操作。
答案 1 :(得分:2)
使用Ruby on Rails(以及更多其他MVC Web框架),控制器通过某种路由配置映射到URL。
例如,/ mysection / view / 2通常映射到controller = mysection
,method = view
,id = 2
(在Rails中,这是默认映射,在./config/routes.rb中) :map.connect ':controller/:action/:id'
)
当你说“有一个用户控制器和很多操作该对象的方法说用户/添加,用户/编辑,用户/删除,用户/个人资料”时,我认为你的意思是一个模型 - 所以你会有UserModel.create(),UserModel.find()等。然后控制器将使用模型来编辑数据 - 实际控制器应该只有几行代码调用模型(比如说@myuser = User.find(id)
),并且一些映射到网址的方法(例如/usercontroller/new
,/usercontroller/edit
,/usercontroller/view
)
该描述相当Rails特定,但大多数PHP框架将非常相似 - 我知道CodeIgniter使用几乎相同的布局。
答案 2 :(得分:1)
在创建控制器时,我通常会考虑用户看到的内容以及用户的直观内容,因为控制器会映射到URL上。
在您的示例中,如您所述,让所有与用户相关的页面具有格式/ user / edit,/ user / profile等是有意义的。但是,如果我是你,我不会为管理员提供单独的登录页面,我会使用相同的登录视图,并在其他地方处理管理位。
简而言之,通常我会为用户在使用网站时考虑的每个关键概念制作一个控制器。因此,如果网站上的用户可以添加/删除朋友,我会将其视为一个概念(而不是用户概念的一部分)。所以我会有一个朋友控制器,具有朋友/添加,朋友/列表,朋友/删除等功能。
答案 3 :(得分:0)
控制器更像是触发调用的代码段。在封装良好的代码中,修改模型的方法靠近模型(在同一域对象中)。但是,调用点是分开的(不是同一域对象的一部分)。
某些框架(如struts)提供可配置的控制器(使用xml)。还有一个前端控制器的概念,其中通用控制器充当顶级委托人。我们可以使用这个前端控制器来处理琐碎的映射(不严格处理域)。