如何在我的PHP/SQL/HTML/CSS代码上实现MVC样式?

Ion*_*Ion 9 html css php sql model-view-controller

我一直在开发一个可视化某些数据的程序.我的程序从MySQL数据库获取特定输入并绘制一些图形(libchart库),创建一些表等.

我的问题是,现在它的代码地狱.我有大约7个PHP文件(索引,图形页面,图库等)与HTML/CSS和PHP/SQL代码一起(其中一些只有PHP扩展但内部只有HTML).我暂时没有问题阅读和理解该项目,但我想如果有人试图,他可能会头疼.此外,继续这样的编程是不切实际的,因为该项目未来可能不容易扩展.

您对如何从PHP/SQL成功分离HTML/CSS有任何建议吗?我不想使用框架,因为我没有做任何需要用户输入,会话处理等的事情.我只是运行一些查询并可视化结果.我主要在这里谈论建筑,如果适用,也许是一个脚本来帮助我(我读过Smarty但是我不确定这是否是我需要的).

hak*_*kre 22

您对如何从PHP/SQL成功分离HTML/CSS有任何建议吗?

恭喜您了解如何改进代码.这是前提条件,你需要改进它,主题很冗长.所以你的意志至关重要.

我轻轻地开始,然后尝试给出一些提示.由于您缺少经验,请先寻找一点,最重要的是下面列表的最后一点.但首先要做的事情是:

要将某些东西彼此分开,您需要有一些分隔的代码:

[HTML/CSS/PHP/SQL]

[HTML/CSS] <--> [SEPARATOR] <--> [PHP/SQL]
Run Code Online (Sandbox Code Playgroud)

这里的Separator实际上也是PHP代码,但我认为你明白了.

正如您所看到的,只有SeparatorHTML/CSSPHP/SQL进行了对话.

所以HTML/CSSPHP/SQL都需要有一个带有Separator的接口(它们之间的线)才能使它工作.

通常在程序中传递得到处理的数据.数据非常动态,并且可能具有复杂的复杂性,特别是如果您将数据传递给应该正确格式化的输出例程.

有多种方法可以写出这样的分隔符(或多个分隔符).您可以对软件进行分层,也可以提供在其区域域中执行操作的组件.例如,您有一个数据库层数据库组件,负责与数据库的交互.

或者你有一个模板引擎,它会将你的字符串和数组放入一些可读的HTML中.

简而言之,这是软件设计的面食理论:

  • 意大利面条代码 - 一体化,代码交织在一起,最好是Bolognese或Aglio,Olio e Peperoncino.
  • 烤宽面条代码 - 分层,一层有两个与之相互作用的层(除非是底部或顶部),总是带有Béchamel酱.
  • Tortelini代码 - 只做自己的工作的小组件,里面有肉类或辛辣蔬菜.

就像我们在生活中吃不同的意大利面一样,在编程时我们也需要处理所有这些不同类型的代码,并且随着时间的推移我们开发自己喜欢的味道.作为一个孩子,我们是饲料,但随着时间的推移,我们开始做自己的东西,并改变食谱.

所以我认为这是一个很好的观点,你现在不想让MVC Framework X在接下来几周吃得太棒了,因为有人告诉你这是现在吃的方式.在吃之前,有品尝,对吧?更不用说快餐了,你知道这些面条酱包装 - 只加水.Urgh.

我不知道您的输出需要哪些数据以及输入是什么.以下是输出HTML/CSS并与MySQL数据库交互的应用程序的一些粗略的重构技巧.这可能不是一个完整的列表,描述只能粗略地概述一些想法:

  • 将CSS移出HTML.在链接的CSS定义中有效使用选择器,style如果仍有一些属性,则替换任何属性.这使您的CSS代码可以重复使用并且更加模块化.它将帮助您找到HTML中的缺陷并将结构(HTML)与Presentation(CSS)分开.有效的HTML开始有效使用CSS,这两者非常强大,通常这已经会减轻你的程序输出例程.
  • 将业务逻辑移出HTML.HTML和你的代码都可以成为野兽,所以最好将它们分开.他们倾向于互相争斗,而且两者都非常强大,在你开发应用程序时,战斗会继续,这会让你分心,无法完成你需要做的工作.
    考虑一下你的应用程序中是否需要已经有复杂的输出,或者你可以传递带有子元素的数组(一个键是一个var,一个var可以包含一个字符串或数字或另一个var-array).通常,只需将复杂数据传递到视图模板中即可.然后,HTML只需要回显一些数组成员和/或foreach子数组.这是一种创建模板的非常简单的技术.您可以使用PHP,因此您实际上非常灵活(只需绘制代码所属的边框到视图层,这是应用程序的一部分,例如为视图提供值).
  • 将SQL移出代码.移动数据库交互代码.创建一个或多个具有方法的对象,这些方法以您在实际处理代码中需要(使用)的方式$component->getThatData()返回数据,然后以标准化形式返回数据.然后使这些组件使用专用数据库组件与数据库进行通信.在您的应用程序代码(业务逻辑)中,只使用数据库组件,最好是您创建的对象来获取数据,因此您在主代码中不再有任何SQL行.
  • 划分和征服您的应用程序代码:将您的代码划分为事务脚本.它们通常很容易用现有的意大利面条代码创建,并且可能会成为您正在寻找的中间分隔符.然后,他们将负责处理数据并将其传递(进入输出/视图).
  • 使用清晰的语言:如果您有复杂的格式化字符串数据未经规范化,请自行编写Parser类,为您完成工作,并且可以轻松重复使用(如果您的应用程序就是这种情况).正如您应该期望在代码中尽量减少使用纯SQL一样,您也应该期待将复杂的正则表达式移开.封装变化的关键点.同样适用于处理某些数据的长例程(例如,按其他格式排序,排序和排列),将它们移动到每个数据的组件中,并考虑如何使它们可访问和可重用.
  • 使代码正常运行:了解如何在程序中调用功能的逻辑.您可以尝试将功能与调用它的方式分开.例如,一些调用任何Transaction Scripts的例程.如果您直接通过浏览器请求PHP文件,则可能不需要这样做,因为那些是您的事务脚本,并且Web服务器负责将通过URL发送的命令解析到您的应用程序中的事务脚本.但是,您应该将处理传入命令所需的任何逻辑及其参数包装成可重用的组件(例如,包含标准代码的Request类,以从HTTP请求中获取URL和/或变量).
  • 通过在通过浏览器调用的所有文件的最顶部包含相同的文件来创建公共入口点.然后,您可以将公共代码(如设置应用程序会话状态对象和初始化数据库组件)放入其中,另请参阅Application Controller
  • 通过查找字面上重复的代码来删除重复.将其包装成函数或类.为您自己的应用程序创建一个库文件夹,并将其包含在其中.如果您使用类名和命名空间的常见模式,则可以轻松使用自动加载器来保持包含.使您的图书馆与第三方代码区分开来.将所有第三方代码放入其自己的库文件夹中,每个第三方组件都有一个子目录.
  • 使用轻量级的现有组件.轻量级很重要,因为您已拥有自己的代码,您不希望转而将其全部压缩到框架上.现有的很重要,因为您不想重新发明轮子.您将有足够的工作来重构您的代码.在您对应用程序感觉良好并且仍然拥有能力和意志之后,您始终可以编写所有新内容.但是,如果你是一个人或在一个小团队中,现有的非常强大.简单的库是例如:
  • 创建应用程序状态,例如作为一个对象,您可以使用,以防某些组件需要了解应用程序状态或彼此之间没有直接交互.默认情况下,如果您没有PHP,则使用全局和全局静态变量来创建状态.但是,随着代码的增长,这些变量可能会让您的生活更加艰 当你创建一个应用程序状态对象时,很明显哪些组件可以使用它,可以控制对它的访问(例如调用方法而不是读取变量,这可以帮助调试)和组件也可以找出它是否是正确的时间在应用程序流程中开始行动.它也是随着时间的推移重构代码的好工具.
  • 保留工作应用程序,使代码保持运行状态.理想情况下,这将由自动测试支持.考虑一下你需要重写很多.例如,如果您开始集成数据库组件,请执行此操作.只需一步即可将所有现有代码移至该位置.那么谁告诉你它还在运行?使用git可以更好地撤消和测试内容.这比选择合适的库更重要.保留工作应用程序也始终是关键点,因为这就是你改变它的原因,对吧?

  • 怎么有人不能为此+1? (2认同)