不依赖框架的MVC教程?

62

我想学习MVC“架构模式”,但是我暂时不想跳进像Rails或Django这样的框架。 我想先理解概念并在我的熟悉环境(PHP / HTML / CSS / MySQL)中编写一些简单的代码。 我不一定需要基于PHP的教程,因为我了解许多不同的语言。而且我不想安装任何框架、API或库。我只想学习如何以MVC的方式思考并将其应用于我的项目。 有什么建议吗?


1
我刚刚在GitHub上发布了一个“裸骨MVC PHP应用程序”,旨在为这些学习目的制作。 - Sliq
5个回答

28
几乎每个框架实现MVC的方式都不同,所以你可能会更加困惑。 MVC的基本原则非常简单:“模型是状态;视图响应模型;控制器响应视图;控制器更改模型”。 模型,视图和控制器是概念 - 它们可以是您认为它们是什么。 类,一堆类,带有XML配置文件的类的实例,您自己决定。
我认为这基本上涵盖了原则。没有框架,你不会走得更远。重要的是特定框架如何定义模型,视图和控制器以及它们之间的交互。

你是在暗示我不能在不使用像Rails或Django这样的现有框架的情况下,将现有项目重写为“MVC”吗? - Ixion
3
框架是MVC抽象概念的具体实现。即使您不使用预制框架,也会在创建过程中创建自己的实现。 - troelskn
6
没问题。我只是不想要学习别人框架的额外负担。我想要理论和思维方式。这就是我们过去学习计算机科学的方式。我不介意构建一个基础的自定义框架。如果需要这样做,那就这样吧。 - Ixion
1
我不确定我理解这个回答的问题。这是否意味着你认为他不能做到? - dkretz
我很确定他不是说他做不到,而是在说他最终会编写自己的“框架”,使用他所描述的想法。 - cwap

20

MVC基本上就是将你的代码分成一个处理数据的模型(Model),一个显示数据的视图(View),以及一个将数据从模型传递到视图的控制器(Controller)。

它不需要API或框架,仅仅是一种分离代码的方式。许多框架使用它的原因是它是一个非常简单的概念,适用于许多事情(特别适合网页),而且相当灵活(例如,在Rails中,如果你愿意的话,你可以在视图、模型或控制器中完成所有事情)。

以下是一个Python脚本的快速示例,展示了MVC结构。这并不一定是最佳实践,但它可行且相当简单:

class Model:
    def get_post(self, id):
        # Would query database, perhaps
        return {"title": "A test", "body": "An example.."}

class Controller:
    def __init__(self):
        self.model = Model()
        self.view = View()

    def main(self):
        post = self.model.get_post(1)
        self.view.display(post)

class View:
    def display(self, item):
        print "<h1>%(title)s</h1>\n%(body)s" % item

c = Controller()
c.main()

我并不确定它到底有多简单。对我来说,学习一门编程语言相当简单,只需要掌握语法即可。但是我仍然难以理解其中的核心问题...我希望能够找到一个和谐的解决方案。 - David
理论上,MVC看起来很简单,但实际上问题在于PHP语法以及每个框架如何组织类、控制器和视图(有时使用不同的语言进行视图并与JS集成)。为了概述,我建议阅读这篇文章:http://code.tutsplus.com/tutorials/object-oriented-php-for-beginners--net-12762。 - maioman

7

除了Sander的回答外,我想说大多数框架混淆了前端控制器MVC。它们实际上是两个完全不同的概念,但通常都存在于框架中。所以请注意这一点。


1
同意!+1,前端控制器是一种类似于MVC的模式,主要用于Web。据我所知,Rails、ASP.Net MVC、ASP.Net Monorail、Django等都是前端控制器。 - Mendelt
也不是对所给问题的答案。 - dkretz

1

我知道现在已经很晚了,但我相信以后会有人提出同样的问题。

我认为上面的代码示例最好这样写,但你的想法可能不同:

#!/usr/bin/python
class Model:
  def get_post(self):
    return {"title":"A test","body":"An example.."}

class View:
  def display(self,items):
    print 'Title:',items['title'],'\n'+'Body:',items['body']

class Controller:
  def __init__(self):
    self.model=Model()
    self.view=View()

  def main(self):
    post=self.model.get_post()
    self.view.display(post)

mvc=Controller()
mvc.main()

这里是另一个使用继承的例子,它在Python/PHP中非常有用......

#!/usr/bin/python3
class Control:
  def find(self,user):
    return self._look(user)

  def _look(self,user):
    if user in self.users:
      return self.users[user]
    else:
      return 'The data class ({}) has no {}'.format(self.userName(),user)

  def userName(self):
    return self.__class__.__name__.lower()

class Model(Control):
  users=dict(one='Bob',two='Michael',three='Dave')

class View():
  def user(self,users):
    print(users.find('two'))

def main():
  users=Model()
  find=View()
  print('--> The user two\'s "real name" is:\n')
  find.user(users)

if __name__=="__main__":
  main()

如果你理解了这个,现在就去学习Django吧。只需阅读免费书籍,如果你理解了它,你会很快掌握它的。但是,在使用Django之前,你必须了解面向对象编程(OOP)和模型-视图-控制器(MVC)范例,因为Django是基于这些范例构建和使用的。

正如你所看到的,这并不复杂,只是保持代码有序的众多方法之一。

这解释了Django中的MVC


1
MVC的主要优点是关注点分离。编写代码时,如果不小心就会变得一团糟。因此,知道如何将模型、视图和控制器放在不同的“隔间”中,在长期来看可以省下你很多时间。任何策略都是好的。
所以这是我的策略:
  • 模型是在项目树中的/lib文件中找到的文件
  • 视图是在项目树中以.html结尾的文件
  • 控制器是<form>动作属性中的URL

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接