我一直很难理解MVC,MVP,MVVM等的全部概念。我甚至不确定我是否遵循任何这些模型所以我希望你们中的一些人可以解决一些问题。我的应用程序使用PHP,JS,HTML,CSS,AJAX,MySQL作为核心。
查看
我知道HTML / CSS显然是View,但有时候,我有PHP生成HTML元素。此外,有时我有JS操纵HTML元素来修改它的CSS。我的意思是,PHP在技术上是一种服务器端语言吗?那么PHP可以生成“View”元素的事实是否会改变其在编程模式中的作用?
处理AJAX请求的专用文件
我有一个PHP文件来处理从JS发送的所有AJAX请求。我传递一个唯一的POST或GET参数来区分AJAX请求是什么,PHP文件有一堆If语句来处理这些。
$req = $_REQUEST['type'];
if($req == 'get_users'){
// do stuff
}
大多数功能都是数据库写入和读取。我是否认为这是控制器?
MODEL
我假设模型是我定期调用的函数和类的集合?
概要
我的主要问题是编程模式是否可以应用于多种编程语言,即使一个是客户端而另一个是服务器端。我是否遵循编程模式?如果我不是或者有点接近,如果我没有完全遵循一个模式,那有关系吗?我认为这就是阻碍我,希望你们都能帮助我理解的东西。
答案 0 :(得分:3)
我知道HTML / CSS显然是View,但有时候,我有PHP生成HTML元素。
视图实际上应该是包含表示逻辑的实例。他们从模型层获取信息,并根据此信息决定发送给用户的响应。响应可以只是一个HTTP标头,也可以是一个HTML文档,该视图是从多个模板组合而成的。
PHP可以生成“View”元素改变其在编程模式中的作用这一事实吗?
这类涉及的主题是,你无法实现经典的MVC(如定义的for smalltalk),因为视图应该是观察变化的模型。这对于网络来说非常难以实现,非常不切实际且根本无法扩展。相反,对于Web,我们倾向于使用模型2 MVC,MVP和MVVM模式,这些模式受原始MVC的启发。还有HMVC模式,它实际上与MVC无关,但试图解决同样的问题。
所有这些受MVC启发的模式在实现表示层的方式上都有所不同,这也是视图。在Model2 MVC模式中,您有一个活动视图,它从模型层请求信息。在MVP和MVVM中,视图是被动的,并通过类似控制器的结构接收数据。
大多数功能都是数据库写入和读取。我是否认为这是控制器?
如果我理解你的意思那么:不,不是真的。
在所有受MVC启发的模式中,控制器或类似控制器的结构主要负责更改模型层和视图的状态。在MVP和MVVM中,它还从模型层请求数据,在MVVM中它甚至可以操纵它。
但是与存储的交互(可能是也可能不是SQL数据库)深埋在模型层中。我在这个主题上写了更长的post。
我假设模型是我定期调用的函数和类的集合?
不完全正确。请参阅上面的链接。
我是否遵循编程模式?
没有代码就很难分辨,但我非常有信心,你并没有严格遵循任何MVC设计模式。你正在做的是实现某种形式的SoC,这是MVC的核心原则。我会说你正处于PHP开发人员实际开始研究OOP原则和模式的阶段,以便进一步改进。
答案 1 :(得分:2)
大多数功能都是数据库写入和读取。我是否认为这是控制器?
如果是:
如果它正在进行上述的多项工作,那么它就是一个不同角色的大杂烩,你应该考虑将你的问题分开。
我假设模型是我定期调用的函数和类的集合?
该模型是与您的数据交互并强制执行业务逻辑的代码。
我的主要问题是编程模式是否可以应用于多种编程语言,即使一个是客户端而另一个是服务器端。
是
您可以使用编辑DOM(View)的客户端JavaScript,根据用户输入(Controller)决定要执行的操作,并使用XMLHttpRequest从服务器(Model)获取数据。
然后你可以让PHP为JS(View)生成JSON,设备根据JS(Controller)请求中的数据做什么,并与数据库交互以获取响应的数据(Model)
我是否遵循编程模式?
听起来你可能正在关注god anti-pattern,但你只是简要概述了你在做什么。
答案 2 :(得分:0)
I mean, PHP is technically a server-side language right?
是的,没错。 (虽然它可以在本地使用,但它甚至可以编译为生成桌面应用程序二进制文件,等等。)
So does the fact that PHP can generate "View" elements change its role in the programming pattern?
没有。核心“视图”概念是与应用程序其他部分的分离。理想情况下,您在“视图”层中不会有任何业务逻辑,数据库查询等。例如:首先,您执行所有计算和操作。最后一步,将结果转换为输出的“视图”(如HTML,XML或JSON ......)。您没有将“echo”语句与SQL查询混合在一起。
Do I have it right that this is the controller?
在您的描述中,我们有两个不同的东西:一个可以称为“路由器” - 您可以根据HTTP请求确定要调用的函数/方法。
在这种情况下,“控制器”将是该函数,它们又调用数据库读/写函数和视图构建函数。控制器与模型交互,并提供输出。它是应该与数据库交互的模型。
I am assuming that the model is the set of functions and classes I call periodically?
模型通常是读写数据库的函数组。这是主要的现实世界用法。但这是不“模型”的定义 - 它只是它最常见的形式。
例如:如果您有一个销售产品的虚拟商店。然后,您将拥有一个“产品”模型,即处理新产品插入数据库的类,产品信息的更新,价格的计算,以及您可能想要在“产品”中执行的所有其他操作”。这些方法必须适用于任何控制器,任何路径,任何视图 - 这是模式分离/组织职责的一个目标。您应该能够使用相同的商店模型创建一个全新的前端网站。
whether or not a programming pattern can apply to more than one programming language even though one is client-side and another is server-side.
是。我们在单个应用程序中使用许多不同的语言:HTML,JavaScript,PHP,SQL等。整个应用程序可以遵循一组模式。每种语言都可用于在模式中执行一个或多个角色。
Am I even following a programming pattern? If I am not or am somewhat close to one, does it matter if I am not following a pattern exactly?
是,你是。我认为,即使你没有它的名字,即使你遵循“你自己的模式”,你肯定会遵循一些模式,否则你将无法构建你的应用程序。该模式可以是MVC,ABC,XYZ,CSM或其他。当然,如果您了解这些概念,您可以使用这些概念与其他开发人员讨论您的应用程序代码。学习肯定是件好事,但是......
否,如果您没有完全遵循模式,则“无关紧要”。您最终可能会创建一个新的,增强的,更好的模式!有时担心融入某种模式可能会破坏你的创造力。不要担心它比你应该做的更多。
所有这一切,我认为你做得对,想要了解,理解甚至掌握这些模式及其概念。对于程序员来说,MVC是一个重要的事情。一个好老师可以提供帮助。读好书和文章。问题和回答在这里。谷歌的一些研究......最重要的是,编码经验。如果你有一个实用的目标来实现,一个应用程序代码,并应用你在实践中学到的东西,你将逐渐理解它们。