如果你要以这种方式做事,你想把你的逻辑和设计分开,这是真的。
但是您不需要使用Smarty来执行此操作。
优先事项是关于心态。我见过人们在Smarty中做一些令人震惊的事情,它最终会变成人们在Smarty中开发网站,然后一些明亮的火花会决定他们需要在Smarty中编写一个模板引擎(永远不要低估一个愚蠢想法的潜力)。
如果你把你的代码分成两部分,强迫自己遵守一个标准,那么你会得到更好的性能。
PageLogic.php
<?php
$pageData = (object)(array()); // Handy trick I learnt.
/* Logic Goes here */
$pageData->foo = SomeValue;
ob_start();
require("layout.php");
ob_end_flush();
布局.php
<html>
<!-- etc -->
<?php for ( $i = 1; $i < 10; $i++ ){ ?>
<?php echo $pageData->foo[$i]; ?>
<?php } ?>
<!-- etc -->
</html>
PHP是作为模板引擎编写的,所以你至少应该在评估是否需要深入研究Smarty之前尝试使用它来完成它的设计任务。
此外,如果您决定使用模板引擎,请尝试获取一个默认转义HTML的引擎,然后“选择退出”而不是“选择加入”。您将为自己节省很多XSS的麻烦。Smarty在这方面很弱,正因为如此,有很多内容天真的模板写在上面。
{if $cond}
{$dangerous_value}
{else}
{$equally_dangerous_value}
{/if}
通常是智能模板的方式。问题是$dangerous_value可以是任意的HTML,这只会导致更糟糕的编码实践,到处都是无法追踪的意大利面条代码。
您考虑的任何模板语言都应该满足这一问题。例如:
{$code_gets_escaped}
{{$code_gets_escaped_as_a_uri}}
{{{$dangerous_bare_code}}}
这样,在模板中可以很容易地识别出潜在的剥削门道,而剥削的门道是默认行为。