【问题标题】:Minimising PHP logic in the View of an MVC在 MVC 的视图中最小化 PHP 逻辑
【发布时间】:2012-08-17 19:21:20
【问题描述】:

我有一些 html 代码,其中包含一些 php 变量,它描述了我的搜索结果中单个条目的内容(例如图片、姓名、共同朋友的数量等) - 这在我的代码中称为 search_results_v.php以下。我有一个数组,其中包含来自数据库的多条记录,并且对于每一条记录,我都会创建一个搜索结果条目。我构建程序的方式是 MVC,所以 html 代码是视图,我有一个 php 控制器。

但是,我有一个网站模板,并希望在此模板中包含我的搜索结果。这可以通过在此网页的适当部分调用我的控制器轻松解决,但我想让我的应用程序让控制器控制一切!在我刚刚提到的情况下,视图正在调用控制器,但我想要一个像下面这样的设置,我只是在我的控制器中“包含”网页。

如何在网页中呈现我的搜索结果,同时尽量减少其中的 php 逻辑数量?我正在考虑这样做的一种方法是将所有搜索结果的所有 html 代码存储在一个 php 字符串变量中,然后在我的网页中引用这个变量。 html 代码如何存储在该变量中?

// Generates my search result box - Fill in the profile picture, the name and the number of mutual friends

    foreach ($resultsInfo as $entry) {
        $uid      = $entry['uid'];
        $pic_link = $entry['pic_square'];
        $name     = $entry['name'];
        $mfCount  = $entry['mutual_friend_count'];
        include('searchresults_v.php');
    }

编辑:好的,也许我想要的并不是一个 MVC。我试图尽可能多地将实际的后端编码从界面中分离出来,以便更熟练的人可以进来设计一个界面。我基本上想生成所有动态数据,并在我的 html 文件中添加一些占位符,以便内容可以直接插入。我不希望其中有任何逻辑来混淆可能只有网页设计经验的人.

让我知道我应该把我的标题改成什么。

【问题讨论】:

  • 在MVC中,HTML代码不是视图,控制器不是控制一切
  • @orourkek 你为什么这么说? CodeIgniter 建议你将 HTML 代码放在视图中,你还会把它放在哪里? codeigniter.com/user_guide/general/views.html
  • @PeteHerbertPenito 因为 CodeIgniter 不是 MVC 框架?正确的 MVC 视图不是模板。模板不能向模型发出请求或管理模板,就像视图实际上应该做的那样......而且他从未提到过 CodeIgniter,所以我不知道你为什么会提出它
  • @orourkek lol 听起来你需要阅读一下:phpmaster.com/untangling-mvc-with-codeigniter
  • @PeteHerbertPenito 我真的希望你在拖钓。如果没有,您应该阅读 MVC 的实际含义 - 开始 here。 CodeIgniter 在不符合 MVC 模式(加上大量的 SOLID 违规...)方面绝对是最糟糕的框架之一。

标签: php html model-view-controller


【解决方案1】:

在 MVC 中,视图始终可以包含循环语句和条件语句。基本思想是不在视图中实现查询/业务逻辑,这应该由模型完成

在您的情况下,恕我直言,您应该构建的内容是这样的:

  1. 控制器调用一个模型,该模型生成所有需要的信息并将其格式化为数组、json 字符串或类对象,然后将其传递回控制器。

  2. 控制器将这些数据连接到视图中。视图循环遍历 array/json/object 并以页面需要显示的任何格式显示内容

【讨论】:

  • 那是你的解释我的朋友。我不是一个纯粹主义者。另外,我告诉 OP 我认为他应该创造什么。不是控制器所做的。控制器的解释与 MVC 的用户一样多。对于控制器可以或应该做什么,并没有类似的“标准”。只有好的做法和坏的做法。此外,说这不是控制器所做的,然后不说,根据您的实际所做的,并不能澄清任何事情。
【解决方案2】:

您可以在模板中包含您的视图吗?您可以将视图的文件名传递给模板,并将其包含在模板中间。

【讨论】:

  • 感谢您的回复-是的,我想这样做,但搜索结果视图仅包含单个条目的代码,因此要在其中生成所有结果,我需要在其中进行循环- 这是我希望避免的事情(见编辑)!
  • 您也可以将该代码放在视图中...这样您就可以拥有一个可以调用另一个视图的视图。最后,您将拥有包含模板或布局的控制器,其中将包含一个视图,然后该视图将执行您的循环,该循环将包含您的较小视图。
【解决方案3】:

如果您想在没有 CodeIgniter、CakePHP、Symfony 等框架的情况下继续前进,您可以查看 Smarty。它非常易于使用,并使模板非常易读。你可以最小化逻辑,但如果你需要,它会给你足够的空间来放置逻辑。

http://www.smarty.net/

http://www.smarty.net/syntax_comparison

使用 smarty,您可以将生成模板的文件视为您的控制器/视图。执行所有逻辑,收集所有数据等,然后将其传递给 smarty 模板。

【讨论】:

  • 谢谢马特!这看起来会很有用!
  • 不客气。我喜欢和 Smarty 一起工作,所以我很乐意推荐它。 :) 这非常简单。
  • -1 视图不是模板。 smarty 是用 PHP 编写的最糟糕的东西之一。
  • 关于模板不是视图的好电话。我已经更正了我的答案。该视图正在确定要使用的模板。为什么 Smarty 是用 PHP 编写的最糟糕的东西之一?我从来没有遇到过任何问题。
【解决方案4】:

Hy

您可以创建一个没有任何逻辑的 HTML 页面。对于包含用户的表,您只创建用户的一个示例行。 请参见下面的示例:

<table>
     <tr>
        <td>Firstname</td>
        <td>Lastname</td>
        <td>Age</td>
     </tr>
     <tr class='user'>
        <td class='firstname'></td>
        <td class='lastname'><td>
        <td class='age'><td>
     </tr>
</table>

之后,您使用 PHP(Lib ex. Simple HTML Dom Parser)将 HTML 文件解析为对象。

此时,您可以使用 PHP 生成视图,例如克隆、删除、重命名、填充视图中的元素,并选择 jQuery 执行的“find(.firstname)”等元素。编辑视图后,您从对象生成 HTML。

我更喜欢这种方法,因为网页设计师只需要使用 HTML 和 CSS 创建视图,不应该学习模板是如何工作的(例如 PHPTal)

希望有帮助

【讨论】:

    【解决方案5】:

    我会使用 jquery(或任何其他 Js 框架)以 JSON 格式获取我的数据并添加 php 无法提供的所有客户端副作用

    【讨论】:

    • 本话题与javascript无关。
    • 先生,您是否阅读了该帖子或他正在尝试做什么?网页设计师进来做他的工作没有 php 逻辑?或者你只是在这个论坛上逍遥法外
    • 您的解决方案是“添加 jquery”?!?老实说,我希望您只是在发送垃圾邮件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多