【问题标题】:PHP | Templates - Using files as template onlyPHP |模板 - 仅使用文件作为模板
【发布时间】:2019-01-11 20:19:06
【问题描述】:

我目前正在使用自己的模板系统,我需要将变量分配给它们的占位符,这些占位符稍后将被替换。不幸的是,目前还不能直接在模板中使用 if/else 之类的条件。我总是必须在 PHP 中处理这个问题,并且需要将最终值分配给模板。

它目前在 php 中的情况: $template->assign('{content}', ($b ? 'value' : 'value2')),在 html 中:<div>{content}</div>

我想要的: <div><?php echo ($b ? 'value' : 'value2'); ?></div><div><?php echo ($b ? 'value' : $this->renderAnotherTemplate()); ?></div>

我可以使用 .php-files 或类似的东西,但据我记得,模板文件名在 url 中可见。所以我需要一种方法,从模板文件中读取字符串,执行它的 php 并访问我在解析器中使用的当前变量(eval 很危险)。

你们中的任何人有一个好主意,如何做到这一点?

谢谢!

【问题讨论】:

  • 几乎没有可靠的方法让解析器运行 php 代码而不使其本质上只是一个 eval(例如包含)。您最好的办法是找出如何以您自己的方式使用 if/else 语句,或者使用已经这样做的现有模板系统。您自己的方式将取决于您,但您实际上是在编写自己的语言解析系统。
  • @Jonathan 是的,我已经意识到这一点,但我希望有另一种方法。 ://
  • 您可以通过某种方式为占位符分配一个回调函数,以便在渲染时对其进行评估。
  • 此外,eval/include 也不是很好,但只有在您无法控制正在渲染的文件时才会真正危险。如果它们不是用户提交的模板,则包含 php 文件没有任何问题。它与在系统中包含任何其他文件(无论是否包含模板)一样安全。

标签: php html parsing templates conditional-statements


【解决方案1】:

为什么不直接包含一个 PHP 文件?

include(‘template.php’)

您将能够访问模板文件中在您调用 include() 的范围内可用的所有变量。您可以将其包装在模板对象的方法中,该方法也可以接受要在模板文件中使用的变量。

另一种解决方案是引入模板语言,例如刀片、树枝或智能。但老实说,我只是在一个小项目中使用更简单的包含

【讨论】:

  • 这与 eval 基本相同,因为它将运行文件中的所有 php 代码,而不仅仅是 OP 想要的语句。
  • OP 中没有建议模板文件来自用户输入或任何其他外部源,那么运行所有 PHP 代码的危害在哪里?仅根据提供的信息进行
  • 我从未说过它们来自用户输入。不过我同意,并在上面说是对这个问题的评论。但是,他们明确表示 eval 是邪恶的,这意味着他们可能不想以某种方式使用 eval。我的观点是 include 本质上只不过是 eval 的包装器。
猜你喜欢
  • 2012-10-12
  • 2014-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多