【问题标题】:How do I determine my controllers in MVC?如何在 MVC 中确定我的控制器?
【发布时间】:2010-09-16 03:39:47
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: php model-view-controller controller


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      例如,/mysection/view/2 一般映射到controller = mysectionmethod = 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 使用几乎相同的布局。

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          【解决方案4】:

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

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2021-12-09
            • 2019-03-29
            • 1970-01-01
            • 2013-02-13
            • 1970-01-01
            • 2021-10-20
            • 2023-03-14
            相关资源
            最近更新 更多