什么定义了MVC中的传统“页面”概念?

时间:2009-04-17 17:53:59

标签: php model-view-controller codeigniter controller

我目前在使用PHP时使用CodeIgniter作为我的首选框架。我正在努力解决的一个问题是“页面”的概念,以及如何在MVC中正确表示。据我所知,CodeIgniter有一个前端控制器,它委托给页面控制器。在我的思考过程中,每个页面都有自己的控制器。我经常看到有人使用填充了许多方法的页面控制器。所以在这个意义上,每个动作都成为它自己的页面。

我从来没有真正喜欢将多种方法填充到一个控制器中的想法,因为如果你一次只需要一个或两个方法,那么似乎会有太多的开销。每个页面拥有自己的控制器似乎更合理,并且操作只对应于您可以在该特定页面上执行的操作。我是否以错误的方式思考这个问题?

让我更加困惑的是,我会注意到在某些Web应用程序中,他们将拥有一个具有多种方法的控制器(即登录,注册,查看,编辑等),但是在其他应用程序中他们实际上有一个登录控制器和寄存器控制器。 “页面控制器”的正确使用是什么?

3 个答案:

答案 0 :(得分:7)

从域的角度来看,我肯定地说每个域上下文有1个控制器更有意义。不一定每页一个,但根据具体情况,可能就是这种情况。我所说的语境是“密切相关的行为”。

例如,帐户控制器应该处理登录,注册,注销,更改密码,操作。他们都生活在“账户”的背景下

以Stackoverflow为例。我会有一个“问题”控制器,它会有DisplayQuestion,AskQuestion,Delete Question,MostRecent Questions等操作。它们都是由一个控制器管理的不同“视图/页面”。

答案 1 :(得分:1)

你是对的,控制器中的每个公共方法都变成了“页面”。话虽如此,它不一定是一个网页,一个动作可能是一个数据的帖子,然后重定向到另一个动作/页面,所以页面不一定意味着“网页”。

MVC使用了许多约定来使事情发挥作用。例如,每个控制器必须以“Controller”结束。因此,一组用户页面(创建,编辑,删除等)将位于UserController中。在Views文件夹中,控制器类中的每个公共方法或操作都成为文件夹中与控制器前缀匹配的网页(在本例中为User文件夹)。因此,控制器类中名为“Delete”的操作将指向User文件夹中的Delete.aspx页面。

将所有这些方法放在一个类中似乎有点尴尬,但它可以很好地组织基于对象的功能。

答案 2 :(得分:1)

在MVC中,“页面”是将三者放在一起时得到的。模型处理数据层,视图处理用户看到的实际HTML,控制器决定它们如何连接在一起以显示所需的数据。我选择对现有控制器使用单独的控制器或其他方法取决于操作与我拥有的其他控制器的接近程度。说我想要一个UserAdmin控制器,现在最有可能处理添加用户,删除用户,更改密码等。如果我添加的功能涉及以某种方式更改用户的帐户我很可能会把它在那里。如果我将它们分成自己的控制器,我自然会添加另一个。控制器允许您将类似的任务放在一起,以便它们可以利用类中已有的任务,而不必重新创建已经完成的任务。很多是程序员认为应该如何完成的。对你来说有意义的事情对我来说可能没有意义,那就是开发人员(或设计师)的选择。