Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop 在MVC中,控制器是对象还是函数?_Oop_Model View Controller - Fatal编程技术网

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

Oop 在MVC中,控制器是对象还是函数?,oop,model-view-controller,Oop,Model View Controller,我正在学习Symfony2,并声明控制器对象上的方法实际上是控制器,而对象更像是控制器容器 哪一部分具体称为控制器?我是MVC和OOP新手,所以我只是想确保我的操作正确。在您共享的示例页面中,“类HelloController”是控制器,它的“函数”是控制器“方法” 好的,他们引用默认方法indexAction()作为控制器 在这个MVC体系结构中(以及大多数其他体系结构,如果不是全部的话),“index”方法是在请求控制器时调用的默认方法(函数)。该页面实际上描述了Symfony2创建者认可的

我正在学习Symfony2,并声明控制器对象上的方法实际上是控制器,而对象更像是控制器容器


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

在您共享的示例页面中,“类HelloController”是控制器,它的“函数”是控制器“方法”

好的,他们引用默认方法indexAction()作为控制器


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

该页面实际上描述了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())实现的

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

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

非常有帮助,谢谢!两个问题。首先,在每个控制器的一个类中,为什么不使用函数呢?第二,这是唯一的两个选择吗?例如,在rails中,控制器似乎实际引用了具有多个操作的类。@Sam如果控制器更复杂,管理状态,实现多步骤工作流或向导,最好将其与其他代码分离,将其封装在自己的类中。我没有遇到其他的惯例;rails遵循第二个约定(actions==controllers),如果你要学习OOP,那你为什么要在框架上乱搞呢?我觉得我已经掌握了足够的高级概念,我认为通过Symfony的教程将是使概念更具体的一个好方法。不过,我愿意接受建议——你认为我应该怎么做?你应该从研究OOP开始。了解依赖注入、实体原理、SoC和LoD是什么。您可能可以学习如何从框架中编写类,但类并不构成OOP。您可以用汇编语言编写面向对象的代码,也可以用ruby编写纯粹的过程代码。仅仅因为你知道结构,并不意味着你理解范式。你可能会发现列出了一些有用的讲座/书籍,但如果不知道你的实际技能水平,就不可能提出更精确的建议。谢谢你的参考资料,我一定会查看它们。