【问题标题】:Is this overkill, or good use of CakePHP's HTML helper?这是矫枉过正,还是很好地使用了 CakePHP 的 HTML 助手?
【发布时间】:2010-07-13 00:11:35
【问题描述】:

我刚刚重新格式化了我的 CakePHP 应用程序的默认布局。我通过将几乎所有内容都放在 html 辅助方法中来消除尽可能多的内联 html。

这很有趣,但我想知道我从这个练习中获得了什么好处,如果有的话?

<?php
    $output = implode("\n", array(
        $html->docType(),
        $html->tag('html', implode("\n", array(
            $html->tag('head', implode("\n", array(
                $html->charset(),
                $html->tag('title', 'Title For App'),
                $html->css('css', NULL, array('media' => 'screen,print')),
                $html->css('print', NULL, array('media' => 'print')),
                $html->script(array('cufon', 'jquery','external'))
            ))),
            $html->tag('body', implode("\n", array(
                $html->tag('div', $content_for_layout, array('id' => 'wrapper')),
                $html->scriptBlock('Cufon.now();')
            )))
        )), array('xmlns' => 'http://www.w3.org/1999/xhtml'))
    ));
    echo $output;
?>

我想至少它看起来不错且紧凑,而且可读性很好。在这种情况下我应该注意哪些陷阱?我应该注意任何速度问题吗?

我喜欢——但我不喜欢。

我想我需要以一种或另一种方式说服。

如果您想知道,查看源代码时,内爆会在 html 中放置漂亮的换行符。

【问题讨论】:

  • 你知道什么会更干净、更快、更简洁吗?直接的 HTML。我无法忍受这种一对一的语法替换。用 HTML 编写您的 HTML。不要为了避免可怕的&lt;?php ?&gt;标签而在中间人身上穿鞋。
  • 嗯,速度不是问题。我将代码封装在微时间调用中,视图在 0.00459 秒内呈现。
  • 当你需要使用任何比三元更重要的流量控制时,你(使用技术术语)完全筋疲力尽。

标签: php cakephp html-helper implode


【解决方案1】:

几年前我在 Google 小组中讨论过这个问题。最终,您会意识到,在您需要以编程方式操作内容之前,您的操作方式并没有太大的不同——然后,如果您采用 HTML 路线,您会发现您的代码中充斥着 @ 987654321@ & ?&gt; 或字符串连接或双引号变量替换。

现在,许多应用程序下线,我更喜欢维护那些比标记更有用的应用程序。

有很多 HTML 没有被帮助程序覆盖,因此您无法避免混合使用,但您可以通过尽可能使用帮助程序来最大程度地减少复杂性和混乱。当您开始使用表单时,您会收到很多安全问题,并且 ID 和 NAME 会按照 CakePHP 喜欢的方式格式化。

PHPCakePHP 就是为此而构建的。为什么只使用半个语言或半个框架?

【讨论】:

  • &lt;?php ?&gt; 为你的代码添加代码是 PHP 的用途:它是一个模板系统。只需将您的控制器逻辑与显示逻辑分开,您的模板文件自然应该保持相当干净。
  • 对不起,我不同意你的观点。操作数据的查看方式是 View 固有的。忠于 MVC 架构并不意味着无代码视图。无论如何都不要让业务逻辑出现在视图之外……但要排序、拼接、翻转和以其他方式操纵您希望在 VIEW 中查看数据的方式。
  • @meagar:模板化并不意味着大量的 PHP 标签。它可以是 100% PHP 或 95% HTML 和 5% PHP 回显。取决于你想如何使用它。
【解决方案2】:

这样做的不可否认的好处是 100% 正确的语法,因为您已经消除了任何可能的胖手指和缺少打开/关闭标签的可能性。不过我可以从经验告诉你的是,半年后,阅读和修改这个结构的难度将增加一倍。插入条件元素也非常困难。您需要在此处使用三元运算符,这使事情的可读性更差。

总的来说,我建议使用传统的 HTML/PHP 组合。

【讨论】:

    【解决方案3】:

    我个人对此很矛盾,但我在使用 PHP 时选择了 HTML+PHP 模式。我可以看到两者的优点,但这就是我选择 HTML+PHP 的原因:

    1. PHP 是一种模板语言——最好的。作为一种模板语言,我觉得它比任何其他 PHP 模板语言以及其他语言 web 框架中的许多模板语言都优越得多。

      如果我使用 Python 或 Java 之类的语言,我很可能更喜欢您建议的形式 - 但在使用 PHP 时,它并不是完美的解决方案。

    2. 您将失去使用已经为处理 HTML 本身而开发的许多工具的能力。您尤其会失去那些习惯于修改 HTML 并且能够以其他方式对视图本身进行简单更改的人。

    3. 绝对的灵活性,无需添加更多 API 层。

    作为一个副作用,我倾向于使用 for():endfor; 语法等,并努力从不回显 HTML 标签 - 我将重组以避免它(即,不使用方法,除非在helper 等,在这种情况下,我将使用 Html Helper 生成我的标签,因为在 PHP 类或函数中包含 HTML 汤只是愚蠢的:P)。

    【讨论】:

    • 我很久以前就接受了 Leo 的回答,但从那时起,我就朝着完全按照您在此处描述的方向前进。我在方法中使用 CakePHP 的 HTML Helper,在模板中使用纯 HTML(除了“动态”的东西,比如链接。对链接使用 HTML 帮助器可以让我在配置新路由时不必更改所有视图)。
    • 啊,我应该提到我确实在我的视图中使用了表单和 Html 助手,而不是手动生成表单和链接。此外,i18n 的 __() 函数。
    【解决方案4】:

    通过使用帮助程序,您可以在某种程度上对您的代码进行验证。因此,当 HTML5 出现并且 htmlhead 标记在新规范中发生更改时。从理论上讲,您只需更改您的 html 帮助程序类,您的所有标记都是 HTML5。

    但是,相反,您也依赖于 Cake 来生成格式良好的标签。尽管这些框架中有很多是全栈的,但不可避免地有一些领域它们处理得比其他领域更好。您不应该期望它们能够提供整个 HTML 标记集。

    我个人认为做你所做的事情有点过头了。由于目录映射的好处,我喜欢将 HTML 帮助程序用于链接、url 和包含的文件。但我不使用助手生成简单的div 标签。

    【讨论】:

      【解决方案5】:

      以编程方式,这是非常正确的,因为您实际上从未构建过字符串。好的是因为每件事都是一个函数,你可以向它传递各种参数,并将所有逻辑推送到你的控制器。例如,您的标题可以为每个页面动态生成,然后传递给您的$html-&gt;tag('title', 'Title For App') 调用。

      但是,由于函数调用的数量庞大,我怀疑它的性能不如简单地使用 PHP 循环和回显变量。

      【讨论】:

      • 数据操作的复杂性可以很容易地传递给元素或自定义助手。我最近一直在这样工作,我不得不说——对于那些宁愿写 php 而不是 html 的人来说——这似乎更容易维护。
      猜你喜欢
      • 1970-01-01
      • 2015-03-09
      • 1970-01-01
      • 2017-05-03
      • 1970-01-01
      • 2012-06-11
      • 1970-01-01
      • 1970-01-01
      • 2013-01-10
      相关资源
      最近更新 更多