使用Smarty模板引擎与使用纯PHP相比,有哪些好处?

3

我正在考虑是否在php代码中使用一些模板引擎,现在我正在仔细研究Smarty。

说实话,它的好处对我来说并不清楚。

从一开始我的印象并不是很好。 我尝试通过演示应用程序进行了解:http://www.smarty.net/sampleapp1。但是从一开始我就收到了通知。我通过向表单传递值来修复了这个问题。我改变了代码:

// adding a guestbook entry
$guestbook->displayForm();

为了

// adding a guestbook entry
$guestbook->displayForm(array('Name' => '', 'Comment' => ''));

在猜测这个问题时,我意识到它会使代码调试变得更加复杂。这也促使我学习了一门新语言——虽然它很容易,但如果没有必要,最好不要学习新东西。另一种选择是使用 PHP 本身。 http://www.smarty.net/syntax_comparison 是一个最有趣的语法比较:计算符号数量...... 但我熟悉 PHP,对我来说在上面编写很容易,而 Smarty 对我来说是新的。我认为对于网页设计师来说学习一些简单的 PHP 结构并不难,而在这方面,Smarty 更简单。如果我错了,希望能听到网页设计师的声音。
Smarty 解析代码,这实际上是时间开销。
但同时许多人使用它。这就是为什么我想了解原因呢?哪里有好处?我错过了什么吗?
如果您知道 Smarty 的良好替代品,那就好了解一下。
谢谢!
更新:
我还发现了一个关于此主题的问题:如何更好地使用 PHP?。总的来说,这也与不使用 Smarty 有关。但这已经是 1.5 年前的事了。可能有些改变了吗?
4个回答

4

我同意它会导致额外的负担,我曾经在一个使用Smarty的项目中工作过,那真是一场噩梦。你可以获得两个好处:

1:不熟悉PHP的设计师可以在不需要编码技能的情况下处理你的HTML。但这是否意味着他们最终需要先学习Smarty?我真的看不出有什么意义。

2:对于模板分离:你可以像使用Smarty一样使用PHP的替代语法,而不失去这个强大的编程语言的功能。替代语法的例子如下:

<div>Product list</div>
<?php foreach($products as $product): ?>

<div>Product: <?php echo $product->name; ?> </div>
<div>Price: <?php echo $product->price; ?> </div>
<?php if($product->discountPercentage): ?>
<div>
Discount: <?php echo $product->price * $product->discountPercentage / 100; ?> off! </div>
<?php endif; ?>

<?php endforeach; ?>

1
在你提到的观点上,我完全同意。但是你的观点非常有价值,因为你在使用Smarty进行实际项目时积累了经验。谢谢!我对于备选语法也完全持相同看法。此外,现在我们可以经常用<?来代替<?php,使其更简单易懂。 - sergtk
1
@Charlie Pigarelli,如果语言允许在HTML代码中引入标签,PHP就是这样的语言,我同意你的观点。只是想听听其他有经验的人的不同看法。 - sergtk
1
请记住,“Smarty帮助你将逻辑与视图分离”不是一个观点。PHP已经做到了。我正在使用我创建的一个只使用PHP并像Smarty一样很好地分离逻辑和视图的模板类。它比Smarty更快,也不使用任何缓存系统(我个人真的很讨厌) 。 - Shoe
1
哦,我完全忘记指出PHP比您可能使用的任何模板引擎都更安全! - Shoe
@rahmanisback 已接受。感谢您分享经验,我决定实现纯 PHP 模板引擎 - 它真的很简单。我甚至已经找到了一些文章链接,人们在其中分享了解决这种任务的经验。 - sergtk
显示剩余2条评论

2

我在生产环境中使用它,可以说:并不多。

如果你关心代码的外观(这并不是一个不重要的问题),Smarty 可以让代码看起来更加整洁一些:

<?php echo $some_var; ?>

vs.:

{$some_var}

这可以使您的模板文件更易读。

它还强制执行控制器和视图逻辑之间更严格的分离(因为您必须确保将所有相关变量传递到smarty对象中)。

语法足够简单明了(对于较新版本来说更是如此),所以这不是什么大问题。

它可能会使调试复杂化,因为它是控制器和视图之间的神奇分离层,但在完美的世界里,您应该分别验证每个部分.....

缺点?我认为有几个:

-显然,现在您需要处理、包含等整个其他库。

-一些早期的Smarty版本对于循环和其他本应该很简单的东西有一些荒谬的语法。

-当您需要在模板中放置一个简单的JavaScript语句时,像这样:

<script type='text/javascript'>
    $(document).ready(function(){
        //foo
    });
</script>

好的,你可以将这段代码放在一个js文件中而不是内联使用,但是有很多情况下你只需要这几行js代码。Smarty不喜欢花括号,所以你必须用一个丑陋的标签来包装它们,看起来像这样:

{literal}{\literal}

如果是这样,那么让你的代码更加简洁的努力就白费了...

如果我必须选择的话,我可能只会使用非标准的简短形式标签并完成它。


1
感谢您的回答。您的帖子让我更加坚信不使用任何模板引擎 :) Proc看起来像是"SMARTY并不比纯PHP差",但我需要更好的东西:) 另外只是小小的注释:<?php echo $some_var; ?>可以重写为<?= $some_var ?>。 - sergtk
2
如果Smarty只允许你写{$some_var}而不是<?= $some_var ?>,那就非常无意义了。你们最好明白,网页设计师并不像你们想象的那么愚蠢。教一个网页设计师'echo'的意思是'输出'并不难。给网页设计师一次机会吧... - Shoe

0

我想尝试使用Smarty来完成我的最新项目,因为我遇到的一些工作职位要求有相关的使用经验。我还没有深入阅读文档,只是获取了一个可以用于相当简单网站上的工作知识。目前为止,这是我的印象-

好处

我曾经在许多网站上工作过,包括当前的项目,它们都有一个相当相似的结构(模板),从页面到页面都是如此。以往,我通常会在文件结构的某个位置保留一个更新的空白模板,并根据具体情况填充它的附加HTML或PHP代码。 Smarty 的一个好处是您可以将这个一般性的模板存储在 Smarty 模板目录中,并使用表现页面模板中的 {extends} 函数进行填充。例如,以下是已保存的模板(缺少文档类型,SO 给我头疼)-

`

<head>
    <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
    <meta http-equiv="Description" content="{block name=meta_description}{/block}" />
    <title>My Smarty Site - {block name=pageTitle}{/block}</title>
    {block name=additionalHeaders}{/block}
 </head>
    <body>
        <div id="headerDIV">
            <div id="nav-box">
                <!-- Nav would go here -->
            </div>
        </div><!-- end #headerDIV -->
        <div id="mainContainer">
            <div id="generalContent">
                    <div id="pageTitle">
                        {block name=pageTitle}{/block}
                    </div>
                 {block name=pageText1}{/block}
                <div id="page-bottom">
                    {block name=pageText2}{/block}
                </div>
            </div> <!-- end #generalContent -->
        </div> <!-- end #mainContainer -->
    </body>

然后像这样填充:

{extends file="myTemplate.tpl"}
{block name=packageTitle}Simple Template{/block}
{block name=meta_description}This is a simple Smarty Template test{/block}
{block name=additionalHeaders}
    <link rel="stylesheet" type="text/css" href="/css/smarty_test.css"/>
{/block}

{block name=pageText1}
    <p>Hello, {$name}! This is a Smarty Test.</p>
{/block}
{block name=pageText2}
<p>This is some more text....</p>
{/block}

因此,与其为每个相似的页面重复复制我的模板,我使用Smarty扩展它,并使用该特定页面的内容。另一个优点是当我需要更改模板的某些方面时,我只需更改一个页面而不是多个页面(是的,类似于使用许多PHP包含文件)。

缺点

虽然我知道Smarty有很多内置函数并且可以做一些很酷的事情,但要真正充分利用它,您必须学习其语法。如果您已经了解PHP,则需要学习全新的东西才能实现相同的结果。逻辑和设计的分离非常好,直到您需要创建具有许多功能的非常动态的页面-然后您会发现自己使用Smarty语法向模板添加许多条件语句、循环等,您会意识到您可能还不如直接使用PHP。

我确实计划学习更多关于Smarty的知识,因为它在我遇到的许多应用程序中都被使用,并且已被列为工作要求,但我不认为将来会在自己的项目中经常使用它。


0

我们广泛使用Smarty。

我认为在以下方面它是不利的:

1. Parsing of smarty templates to PHP which make things slow
2. Your learning ablity to cope-up with smarty syntax.

从以下几个方面来看,这是有优势的:

  1. 将业务逻辑与表现逻辑分离。
  2. 如果需要显示帮助程序,则符合DRY原则。 (就像erb中的helpers-ROR一样)

除非您的产品将成为大型持续性产品,并且如果使用PHP可以实现所有功能,请避免使用Smarty。


优势 #1:您可以轻松地使用 PHP 自身完成它。 - Shoe

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