【问题标题】:In MVC, is a controller an object or a function?在 MVC 中,控制器是对象还是函数?
【发布时间】:2013-01-28 01:36:26
【问题描述】:

我正在学习 Symfony2,part of the documentation on controllers 声明控制器对象上的方法实际上是控制器,而对象更多的是控制器容器。

哪一部分被具体称为控制器?我是 MVC 和 OOP 的新手,所以我只是想确保我做对了。

【问题讨论】:

  • 如果你正在学习 OOP,那你为什么要搞乱框架?
  • 我觉得我已经掌握了足够多的高级概念,我认为阅读 Symfony 的教程是使概念更加具体的好方法。不过,我愿意接受建议 - 你认为我应该怎么做?
  • 你应该从研究 OOP 开始。了解什么是依赖注入、SOLID 原理、SoC 和 LoD。您可能能够学习如何从框架中编写类,但类不会产生 OOP。您可以在汇编程序中编写面向对象的代码,也可以在 ruby​​ 中编写纯过程代码。仅仅因为您了解构造,并不意味着您了解范例。您可能会在here 中找到一些有用的讲座/书籍,但如果不知道您的实际技能水平,就不可能提出更准确的建议。
  • 感谢您的参考,我一定会检查出来的。

标签: oop model-view-controller


【解决方案1】:

该页面实际上描述了一个由 Symfony2 创建者认可的约定

在一些 MVC 框架中(尤其是在 Java 中),控制器是按照每个控制器一个类的约定来实现的,例如:

class ListContactsController {
    public function start() {
      // query db...
      return ...;
    }
}

class AddContactController {
    public function start($name, $details) {
      // insert into db...
      return ...;
    }
}

请注意,每个控制器类都有一个 start() 方法,它定义了控制器实际执行的操作

在其他 MVC 框架(如 Symfony2 或 cake-php)中,控制器通过每个控制器一个方法的约定实现,为方便起见将它们组合在一起,例如:

class ContactsController {
    public function list() {
      // query db...
      return ...;
    }

    public function add($name, $details) {
      // insert into db...
      return ...;
    }
}

这里的约定假设每个控制器都作为一个方法实现,而不是一个具有特定方法(如 start())的单独类

编辑:考虑这种差异的另一种方式是:

  • one-class-per-controller 假设有一个控制器实例(可能保持内部状态),并且当用户与视图交互时,视图通过回调(即控制器类中的方法)与该控制器实例通信。
  • 每个控制器一个方法假设任何状态都包含在传递给方法的参数中,并且当用户与视图交互时,视图与单独的控制器/操作进行通信。这些控制器被视为独立的概念。

【讨论】:

  • 非常有帮助,谢谢!两个问题。首先,在每个控制器一个类中,为什么不只使用函数呢?其次,这是仅有的两个选择吗?例如,在 Rails 中,控制器似乎实际上引用了具有多个操作的类。
  • @Sam 如果控制器更复杂,管理状态,实现多步骤工作流或向导,最好将其与其他代码分开,将其包含在自己的类中。我没有遇到其他约定; rails 遵循第二个约定(动作 == 控制器)
【解决方案2】:

在您分享的示例页面中,“HelloController 类”是控制器,其功能是控制器“方法”。

好的,他们将默认方法 indexAction() 称为 Controller。

在这个 MVC 架构(以及大多数其他架构,如果不是全部)中,“index”方法是在请求该控制器时调用的默认方法(函数)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-09
    • 2012-06-01
    • 2012-06-02
    • 2012-09-15
    • 2011-05-22
    • 1970-01-01
    • 2010-09-30
    • 1970-01-01
    相关资源
    最近更新 更多