我觉得我将我的表现逻辑与我的模型逻辑混合得太多了。一些帮助?

时间:2011-03-21 16:27:03

标签: php mysql sql html

所以我对PHP,MySQL和Javascript仍然有点新,但我一直在研究一个项目,所以我一直在快速学习。但是,我觉得在我的php页面中我混合了太多的HTML和PHP。起初我认为这是标准做法,但有人告诉我你应该如何混合两者,我开始查看我的代码。

例如,当加载提交页面时,我有一个看起来像这样的循环(浓缩版本):

<?php
while ($row = mysql_fetch_assoc($submissionQuery))
{
  $submissionID = $row['id'];
?>
  <div class="submission" id="submission<?php echo $submissionID; ?>">
    <h3><?php echo $row['title']; ?></h3>
  </div>
<?php } ?>

我之所以不在PHP中包含整个块,是因为那里不仅有h3,而且我不想使用mass-echo语句。

在我看来,这看起来很糟糕,我想知道更好的方法。我想我可以将所有提交内容存储到数组中,然后稍后循环遍历它们,但我看到了几个缺点:

1)不必要将值存储到数组中。只会在之后立即召回。

2)如果提交的内容很多,则可能没有足够的内存来存储它们。

3)需要更多代码。

4)稍后仍然需要循环遍历数组,在这种情况下,我仍在混合使用PHP和HTML(仅在较小程度上)

我不知道。我只是需要一些建议,以便最好地处理这个问题,因为我不想以错误的方式做事情,然后在事情破裂或过于复杂时不得不重构一切。

3 个答案:

答案 0 :(得分:4)

使用PHP时,几乎不可能不混用PHP和HTML。但这并不意味着您将表示逻辑与业务逻辑混合在一起。这是两个截然不同的事情。

在您的示例中,您正在混合代码。更好的方法是。

你有一个文件,称之为submission_proccess.php,在那个文件中你有这个代码。

$submission = array();
while ($row = mysql_fetch_assoc($submissionQuery)) {
   $submission[] = $row;
}

//more logic
//include your view submission_view.php

现在submission_view.php是你的view,可以这么说。你会有这样的东西

  <?php foreach ($submissions as $submission) : ?>
  <div class="submission" id="submission<?php echo $submission['id']; ?>">
    <h3><?php echo $submission['title']; ?></h3>
  </div>
  <?php endforeach; ?>

重要的是要看到您不必触摸视图文件,如果您要修改查询或过滤它。您的业​​务逻辑与您展示它的方式是分开的。您甚至可以删除HTML include,只需要一个带有$submission变量的文件并将其输出为JSON。

你应该关注的一些事情是

  • PHP框架 - Zend,CakePHP,CodeIgnitor,Symphony,Kohona等等。它们可以帮助您分离这些部分
  • 另一件事是PHP alternate syntax for control structures
  • 此外,像Smarty这样的PHP模板系统。有些人可能会争辩说使用Smarty只会增加另一个不必要的层,但是当你不想要一个完整的框架堆栈时它会非常有用。

答案 1 :(得分:0)

我真的不喜欢我的视图模板中的任何服务器端代码 - 我更喜欢只有占位符。但是,大多数框架都在视图中包含循环和回显变量。

看一下像smarty这样的模板系统(我讨厌聪明的BTW),但他们至少会给你机会把这种东西分开,这总是一件好事。

答案 2 :(得分:0)

在不同的抽象层中分离逻辑不排除也不阻止混合PHP和HTML或其他代码。关键在于实现关注点的适当分离和正确的混合程度。

在表示逻辑层中,您将使用HTML,CSS,一些Javascript和一些(可能非常少)PHP进行编码。这就是PHP的工作方式。但是,你可以保持这个代码简单,只是部件的粘合剂。

在业务逻辑层中,您将使用PHP编写代码,可能使用某些SQL或某些javascript。

为了简化问题的分离,我通常会将不同源文件中的图层分开。 在构建时,构建脚本将代码适当地混合到实际的最终工件和渲染中。

最后,你不需要自己重新发明一切。看一下PHP的一些应用程序框架和模板引擎。有些可能是直接的帮助;或者,至少,你会得到一些基于你的想法和设计策略。