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

Posted

技术标签:

【中文标题】如何在我的 PHP/SQL/HTML/CSS 代码上实现 MVC 样式? [关闭]【英文标题】:How to implement MVC style on my PHP/SQL/HTML/CSS code? [closed] 【发布时间】:2012-01-28 14:20:51 【问题描述】:

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

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

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

【问题讨论】:

google.com/?q=php%20create%20your%20own%20mvc%20framework 为了对一切神圣事物的热爱,不要使用被称为 Smarty 的可憎之物。这里也没有理由不使用框架。是否需要会话并不重要,重要的是您需要逻辑和代码分离。这就是 MVC 框架所做的。 简单的 PHP MVC 框架:***.com/questions/1549857/simple-php-mvc-framework 【参考方案1】:

为什么不使用模板引擎? TWIG 非常易于使用,非常适合这类事情。它通常与 Symfony 框架一起使用,但也可以很容易地单独使用。

【讨论】:

【参考方案2】:

您对如何成功地将 HTML/CSS 与 PHP/SQL 分开有什么建议吗?

恭喜您了解如何改进代码。这是前提,你需要改进它,而且话题很长。所以你的意愿很重要。

我从头开始,然后尝试给出一些提示。当您缺少经验时,请先从一点开始,最肯定是下面列表中的最后一个。但首先要做的是:

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

[HTML/CSS/PHP/SQL]

[HTML/CSS] <--> [SEPARATOR] <--> [PHP/SQL]

这里的分隔符实际上也是PHP代码,但我想你明白了。

你可以看到只有 SeparatorHTML/CSSPHP/SQL 对话。

所以 HTML/CSSPHP/SQL 都需要有一个与 Separator 的接口(中间的线)才能完成这项工作。

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

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

或者您有一个模板引擎,它负责将您的字符串和数组放入一些可读的 HTML 中。

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

意大利面条代码 - 合而为一,代码相互交织,更适合 Bolognese 或 Aglio、Olio e Peperoncino。 千层面代码 - 分层,一层有另外两层与之交互(除非底部或顶部),总是与 Béchamel 酱。 Tortelini 代码 - 恰到好处的小组件,里面有肉或香辣蔬菜。

就像我们在生活中吃不同的意大利面一样,在编程时我们也需要处理所有这些不同类型的代码,并且随着时间的推移我们会形成自己喜欢的口味。小时候,我们吃饱了,但随着时间的推移,我们开始自己做饭,并改变食谱。

所以我认为这是一个很好的观点,你现在不想在接下来的几周内使用非常棒的 MVC Framework X,只是因为有人告诉你这是现在吃的方式。在吃之前,有品尝,对吧?更别说快餐了,你知道像这些带酱汁的面条——只加水。呃。

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

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

【讨论】:

【参考方案3】:

因为您不需要用户输入和存储会话。 您可以只创建一个控制器 -> 模型和控制器 -> 视图结构

控制器:将帮助您从数据库(通过模型)获取数据并将数据嵌入到视图中。

您可以创建 3 个文件夹控制器、模型和视图。在每个文件夹中,您可以根据需要创建文件(例如 MVC for User)。

模型可以根据您的需要访问用mysqli.inc.php或pdo.inc.php编写的静态对象,您可以在所有模型类中编写连接、查询、断开连接的模板。

在模型文件中,可以调用静态函数 DB::query('SELECT/INSERT/UPDATE/DELETE', );

例如,您需要一个渲染函数来将数据嵌入到 HTML 代码中

function render() 
   //start output buffering (so we can return the content)
   ob_start();
            
   //bring all variables into "local" variables using "variable variable names"
   foreach($this->vars as $k => $v) 
      $$k = $v;
   
   //include view
   include($this->file);
    
   $str = ob_get_contents();//get teh entire view.
   ob_end_clean();//stop output buffering
   return $str;

在控制器中,您可以包含模型文件,调用特定的类和函数来获取数据。以渲染函数调用视图文件为例,

$view = new view('../view/data.php');
$view->name = 'Your Name';
$view->bio = "I'm a geek.";
echo $view->render();

您可以根据您的要求返回或回显您的视图

【讨论】:

以上是关于如何在我的 PHP/SQL/HTML/CSS 代码上实现 MVC 样式? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如何在我的代码中插入 CALLBACK 代码

我将如何在我的代码中使用图像精灵?

如何在我的代码中添加循环

如何在我的 aspx 页面上显示变量值背后的代码

如何执行用户在我的页面上输入到我的 ACE 编辑器的代码

如何在我的视图中打印 JavaScript 代码?