我刚刚重新格式化了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中添加不错的换行符。
答案 0 :(得分:10)
几年前我在Google小组讨论过这个问题。最后,你会意识到,除非你需要以编程方式操作东西,否则它不会产生很大的不同 - 然后,如果你使用HTML路线,你会发现你的代码充满了 { {1}} &amp; <?php
或字符串连接或双引号变量替换。
现在,许多应用程序都在线下,我更喜欢维护比标记更多帮助的应用程序。
帮助程序没有涵盖很多HTML,因此您无法避免混合,但您可以尽可能使用帮助程序来最大限度地减少复杂性和混淆。当您开始使用表单时,您会获得大量安全性,ID和NAME格式化为 CakePHP 更喜欢的方式。
PHP 和 CakePHP 是为此而构建的。为什么只使用半个语言或半个框架?
答案 1 :(得分:8)
这无可否认的好处是100%正确的语法,因为你已经删除了任何胖指法和丢失打开/关闭标签的可能性。我从经验中可以告诉你的是,从现在开始的半年内,阅读和修改这个结构的难度是其两倍。插入条件元素也很困难。你需要在这里求助于三元运算符,这使得事情的可读性更低。
总的来说,我建议使用传统的HTML / PHP组合。
答案 2 :(得分:4)
我个人对此感到矛盾,但在使用PHP时我选择了HTML + PHP模式。我可以看到其中任何一个的优点,但这就是我选择HTML + PHP的原因:
PHP是一种模板语言 - 最好的。作为一种模板语言,我觉得它远远优于任何其他PHP模板语言,以及其他语言Web框架中的许多模板语言,因为它具有灵活性和强大功能。
如果我使用的是Python或Java等语言,我很可能更喜欢你建议的形式 - 但在使用PHP时它并不是完美的解决方案。
您无法使用已经开发的许多工具来处理HTML本身。你尤其会失去那些习惯于修改HTML的人,以及能够在视图中自行进行简单更改的人。
绝对的灵活性,无需添加更多API层。
作为一个副作用,我倾向于使用for():
和endfor;
语法等,并努力永远不会回显HTML标签 - 我将重组以避免它(即,不使用方法,除非在帮助器等内部,在这种情况下,我将使用Html Helper生成我的标签,因为它只是愚蠢的想要在PHP类或函数中使用HTML汤:P)。
答案 3 :(得分:3)
通过使用帮助程序,您可以在某种程度上验证代码。因此,当HTML5出现时,html
或head
标记会在新规范中发生变化。从理论上讲,你只需更改你的html助手类,你的所有标记都是HTML5。
然而,恰恰相反,你也依靠Cake来生成格式良好的标签。虽然很多这些框架都是完整的堆栈,但它们不可避免地会有一些区域比其他区域更好。您不应期望它们能够设置整个HTML标记集。
我个人认为做你所做的事情太过分了。我喜欢使用链接,网址和包含文件的HTML帮助程序,因为目录映射的好处。但我不使用帮助程序生成简单的div
标记。
答案 4 :(得分:1)
以编程方式,这是非常正确的,因为你实际上从未构建过字符串。有什么好处是因为每个东西都是一个函数,你可以将各种参数传递给它,并将所有逻辑推送到你的控制器。因此,您的标题可以为每个页面动态生成,然后传递到$html->tag('title', 'Title For App')
来电。
然而,由于函数调用数量庞大,我怀疑它不会像使用PHP循环和回显变量一样好。