如果你打算那样做,你想把你的逻辑和设计分开,真的。
但是您不需要使用 Smarty 来执行此操作。
优先级是关于心态。我看到人们在 Smarty 中做令人震惊的事情,最终变成人们在Smarty 中开发网站,然后一些明亮的火花将决定他们需要在 Smarty 中编写模板引擎(永远不要低估愚蠢想法的潜力)。
如果您将代码分成两部分并强迫自己遵守标准,那么您将获得更好的性能。
页面逻辑.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}
通常是 Smarty 模板的运行方式。问题是 $dangerous_value 可以是任意 HTML,这只会导致更糟糕的编码实践,到处都是无法追踪的意大利面条代码。
您考虑的任何模板语言都应满足此问题。例如:
{$code_gets_escaped}
{{$code_gets_escaped_as_a_uri}}
{{{$dangerous_bare_code}}}
通过这种方式,您的潜在利用途径在模板中很容易辨别,而利用途径是默认行为。