这是否有些过度,或者是合理使用CakePHP的HTML助手?

8

我刚刚重新格式化了我的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;
?>

我认为至少它看起来很好,紧凑而且易读。在这种情况下,我应该注意哪些陷阱?我需要注意任何速度问题吗?

我喜欢它 - 但也不喜欢。

我想我需要被说服去做一个选择。

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


4
你知道什么更加简洁、快速和清晰吗?就是直接使用HTML。我无法容忍这种一对一的语法替换。请在HTML中编写你的HTML代码,不要为了避免可怕的<?php ?>标签而硬生生添加中间步骤。 - user229044
1
速度不是问题。我用微秒调用包装了代码,视图在0.00459秒内呈现。 - Stephen
一旦你需要使用比三元运算符更重要的流程控制,你就(用技术术语来说)完全崩溃了。 - Daniel Wright
5个回答

10

我曾在谷歌小组中讨论过这个问题。最终,您会意识到无论您选择哪种方式做,除非需要以编程方式操作内容,否则并没有太大差别-然后,如果您采用了HTML路线,您会发现您的代码充斥着<?php?> 或字符串连接或双引号变量替换。

现在,维护带有更多辅助程序的应用程序比标记更容易。

有许多HTML没有被辅助程序覆盖,因此您无法避免混合使用,但您可以尽可能地使用辅助程序来最小化复杂性和混乱。当您开始使用表单时,您将获得许多安全性相关信息以及按CakePHP首选格式进行格式化的ID和NAMEs。

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


1
在你的代码中添加 <?php ?> 是 PHP 的用途:它是一个模板系统。只需将控制器逻辑与显示逻辑分开,你的模板文件应该自然保持干净整洁。 - user229044
2
抱歉,Meagar,我不同意你的观点。操作数据视图是视图的固有功能。忠实于MVC架构并不意味着视图无需编码。务必将业务逻辑从视图中分离出来...但可以在视图中对数据进行排序、切割、翻转和其他操作,以便更好地展示数据。 - Stephen
@meagar:模板化并不意味着有很多PHP标签。它可以是100%的PHP或95%的HTML和5%的PHP输出。这取决于你想如何使用它。 - Leo

8
这样做的不可否认的好处是语法100%正确,因为您已经排除了任何打错和遗漏开/闭标签的可能性。但从我的经验来看,半年后,阅读和修改这个结构将会变得更加困难。插入条件元素也非常困难。您需要在此处使用三元运算符,这使得事情变得更不可读。
总的来说,我建议采用传统的HTML / PHP混合方式。

4

就我个人而言,我对此持有矛盾的态度,但在使用PHP时,我选择HTML+PHP模式。我可以看到两种模式各自的优点,但这就是我选择HTML+PHP的原因:

  1. PHP是一种模板语言 - 最好的。作为一种模板语言,我认为它比其他任何PHP模板语言以及其他语言Web框架中的许多模板语言都要灵活和强大。

    如果我使用像Python或Java这样的语言,我很可能更喜欢你提出的形式 - 但在使用PHP时,这不是完美的解决方案。

  2. 您将失去使用已开发的用于处理HTML本身的许多工具的能力。您尤其会失去那些习惯于修改HTML并且能够轻松更改视图本身的人。

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

作为这种方式的副作用,我倾向于使用for()endfor;语法等,并努力避免回显HTML标记 - 我会重新构造以避免它(例如,在没有帮助器的情况下不使用方法,除非在帮助器内部,此时我将使用Html Helper生成我的标记,因为在PHP类或函数内部有HTML soup看起来很愚蠢:P)。


我早已接受了Leo的答案,但自那以后我一直在朝着您在此处描述的方式努力。我在方法中使用CakePHP的HTML Helper,在模板中使用普通的HTML(除了像链接这样的“动态”内容)。使用HTML Helper来处理链接可以避免在配置新路由时更改所有视图。 - Stephen
啊,我应该提到我在视图中使用表单和HTML助手而不是手动生成表单和链接。此外,还有用于国际化的__()函数。 - Iiridayn

3
通过使用助手,你在某种程度上未来证明了你的代码。因此,当HTML5出现并且新规范中的htmlhead标签发生变化时,理论上只需更改你的html助手类,所有标记就都是HTML5的了。
然而,相反的是,你也依赖于Cake生成格式良好的标签。尽管许多这些框架是全栈的,但它们不可避免地会处理比其他领域更好的一些领域。你不应该期望它们能够涵盖整个HTML标签集。
我个人认为你所做的有点过头了。我喜欢使用HTML助手来生成链接、URL和包含的文件,因为它具有目录映射的好处。但我不使用助手来生成简单的div标签。

1

从编程角度来看,这是非常正确的,因为你实际上并没有构建一个字符串。好处在于,由于每个东西都是一个函数,你可以向它传递各种参数,并将所有逻辑推到你的控制器中。例如,你的标题可以为每个页面动态生成,然后传递给你的$html->tag('title', 'Title For App')调用。

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


数据操作的复杂性可以轻松地交给元素或自定义助手来处理。最近我一直在这样工作,我必须说 - 对于那些宁愿编写PHP而不是HTML的人来说,这似乎更容易维护。 - Abba Bryant

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接