为从 XML 作为 DOMDocument 加载的模板文件运行 PHP

Running PHP for template files loaded from XML as DOMDocument

提问人:user2999349 提问时间:9/7/2018 更新时间:9/9/2018 访问量:270

问:

我正在编写自己的小 MVC 框架,该框架基于布局 .xml 文件加载模板文件,该文件指定要在何处加载哪些模板文件。这样,就可以通过 XML 和新的 (phtml) 模板文件轻松扩展或修改现有页面。

为此,我使用 DOMDocument 对象将模板文件加载到正确的 HTML 元素中。这现在可以正常工作,但是我刚刚意识到模板文件的PHP内容在转换为DOMDocument时将被简单地解释为纯HTML。

我该如何以正确的方式应对这种情况?我想我应该使用 eval() 从模板文件执行 PHP,然后将生成的 HTML 插入 DOMDocument 对象中。但是,我宁愿避免使用 eval,因为它的形象不好(危险且沉重?不过,这似乎正是我想要的。

如果有人能就这个问题给我一些建议,我将不胜感激。

php 模型-视图-控制器 xml html-解析

评论


答:

0赞 Nigel Ren 9/9/2018 #1

我认为 Twig 将模板转换为 PHP 文件,然后运行 PHP 文件以生成输出,您可以执行类似的过程。这允许您缓存生成的模板,这将减少解析时间。因此,与其执行 PHP 的单个部分,不如执行类似...

// Create temporary file (must have .php extension)
$fh = fopen ( "a.php", "w");
// Write out generated HTML
fwrite($fh, '<SomeTag>Content</SomeTag>'.PHP_EOL);
// Add in PHP code where necessary
fwrite($fh, '<?php'.PHP_EOL);
fwrite($fh, '$a="1";'.PHP_EOL);
fwrite($fh, 'echo $a;'.PHP_EOL);
fwrite($fh, '?>'.PHP_EOL);
fclose($fh);

// Run the generated file
require "a.php";

如果要捕获输出,请使用输出缓冲...

ob_start();
require "a.php";
$html = ob_get_clean();

echo $html;