我觉得我将我的表示逻辑与我的模型逻辑混合得太多了。一些帮助?
Posted
技术标签:
【中文标题】我觉得我将我的表示逻辑与我的模型逻辑混合得太多了。一些帮助?【英文标题】:I feel like I am mixing my presentational logic with my model logic too much. Some help? 【发布时间】:2011-07-19 19:53:43 【问题描述】:所以我对 php、mysql 和 javascript 还有些陌生,但我一直在做一个项目,所以我学得很快。但是,我觉得在我的 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 模型中的表与我的数据库同步,我收到此错误