【问题标题】:Using PHP inside Smarty template files [duplicate]在 Smarty 模板文件中使用 PHP [重复]
【发布时间】:2013-02-14 15:03:11
【问题描述】:

在 Smarty 的早期版本中可以在 Smarty 模板文件中使用 PHP,但现在已弃用。

但是,您仍然可以通过使用向后兼容性包装器来做到这一点。

这使得在模板文件中使用 PHP 成为可能:

{php}echo "Hello World";{/php}

有谁知道这可能导致的任何问题或问题?

【问题讨论】:

  • 不要在 Smarty 模板文件中使用 PHP。你会破坏模板和领域分离的想法。
  • 使用{php}{/php}是MVC的反模式
  • 如果以前的 cmets 对您没有意义,请使用它。
  • 所以你想在 smarty 中嵌入 php 代码,它最初是基于 php 的?那么,为什么不跳过 smarty 并使用纯 php 呢?在某些时候,模板引擎的分层必须停止......
  • 一个非常有效的观点。 @MarcB我问是因为我使用的迷你CMS似乎不起作用,除非我使用上面的方法。这绝对是一个 hack,我将完全按照你说的做,并使用纯 PHP。

标签: php smarty


【解决方案1】:

为了将已经给出的 cmets 扩展为完整的答案,嵌入任意 PHP 代码的问题在于它打破了 PHP 和 Smarty 之间的分离。

由于 Smarty 直接编译为 PHP,所以您在 Smarty 中编写的所有内容都可以用纯 PHP 编写,并且最终可能会或可能不会像可读性一样结束,例如

  • <?= $foo ?>{$foo} 很好
  • <?php if ( $expr ): ?> Hello <?php endif; ?> for {if $expr} Hello {/if} 也不错
  • 但是<?= htmlspecialchars(strtoupper($foo ?: 'Hello')); ?>{$foo|default:'Hello'|upper|escape:html} 有点难看

我看到的使用 Smarty 的主要优点(如果你使用{php},所有这些基本上都是无效的):

  • 明显的分离 - 给定文件被视为模板总是很清楚,因为它在 Smarty 中。相反,直接在 PHP 函数中输出是错误的,因为应该将结果传递给模板。
  • 强制分离 - 如果您不允许从 Smarty 模板调用这些函数,则数据库连接或输入验证等应用程序逻辑不能“泄漏”到您的视图层中
  • 安全性 - 您可以让不受信任的前端开发人员/设计人员访问 Smarty 模板,并严格控制他们有权访问的数据和功能。

如果你将 Smarty 和 PHP 混合使用,你唯一能保留的好处就是 Smarty 语法的那些部分,它们比它们的 PHP 等价物更具可读性,就像我上面展示的修饰符示例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-24
    • 1970-01-01
    • 1970-01-01
    • 2012-06-19
    • 2021-12-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多