在MVC中,控制器是一个对象还是一个函数?

时间:2013-01-28 01:36:26

标签: oop model-view-controller

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

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

2 个答案:

答案 0 :(得分:1)

在您共享的示例页面中,“类HelloController”是Controller,其“功能是Controller”方法“。

好的,他们指的是默认方法indexAction()作为Controller。

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

答案 1 :(得分: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-method-per-controller假设任何状态都包含在传递给方法的参数中,并且当用户与视图交互时,视图正在与单独的控制器/操作进行通信。那些控制器被视为独立的概念。