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

Posted

技术标签:

【中文标题】我觉得我将我的表示逻辑与我的模型逻辑混合得太多了。一些帮助?【英文标题】:I feel like I am mixing my presentational logic with my model logic too much. Some help? 【发布时间】:2011-07-19 19:53:43 【问题描述】:

所以我对 phpmysqljavascript 还有些陌生,但我一直在做一个项目,所以我学得很快。但是,我觉得在我的 php 页面中我混合了太多的 html 和 PHP。起初我认为这是标准做法,但 SO 上的某个人告诉我不要将两者混为一谈,我开始查看我的代码。

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

<?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,而且我不想使用批量回显语句。

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

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

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

3) 需要更多代码。

4) 稍后仍然需要循环遍历数组,在这种情况下,我仍在混合 PHP 和 HTML(只是程度较低)

我不知道。我只需要一些建议来最好地处理这个问题,因为我不想以错误的方式做事,然后在以后出现问题或变得过于复杂时必须重构所有内容。

【问题讨论】:

您可能会发现the alternative syntax for control structures 很有帮助。 【参考方案1】:

使用 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 包含并只拥有一个文件,该文件采用 $submission 变量并将其输出为 JSON。

你应该注意的一些事情是

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

【讨论】:

+1 用于提及框架,但也用于提供完整框架路线的轻量级替代方案。【参考方案2】:

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

看一下 smarty 之类的模板系统(顺便说一句,我讨厌 smarty),但它们至少会给你机会将这类东西分离出来,这总是一件好事。

【讨论】:

Smarty 只是添加了一个额外的 smarty-functions 层...实际上与 php 函数所做的完全相同...使用不同的语法... IMO,它是一个熵层。 【参考方案3】:

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

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

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

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

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

【讨论】:

以上是关于我觉得我将我的表示逻辑与我的模型逻辑混合得太多了。一些帮助?的主要内容,如果未能解决你的问题,请参考以下文章

逻辑回归机器学习模型可以在这里工作吗?

程序员跳槽的底层逻辑与误区

尝试将 mysql 模型中的表与我的数据库同步,我收到此错误

无法将我的 WordPress 帖子与我在 Facebook 上的图片分享

OpenGL - 矩阵逻辑错误

我正在将我的应用程序 Web 逻辑移动到 Tomcat7