我有以下代码,基本上可以渲染部分内容。然而,我试图找到一种方法来防止将
$templatePath
变量污染到模板中(该变量当前可以从模板访问,这不是我想要的)。我只希望 $template
和 $viewHelper
变量在模板范围内可访问。你有什么想法吗?
public function renderComponent(string $templatePath, ViewComponentEntityInterface $component): string
{
if (! file_exists($templatePath)) {
throw new RuntimeException('Incorrect component template path: ' . $templatePath);
}
$viewHelper = $this->viewHelperFactory->create();
ob_start();
try {
(static function (ViewComponentEntityInterface $template,ViewHelper $viewHelper) use ($templatePath) {
include $templatePath;
})($component, $viewHelper);
return ob_get_clean();
} catch (Throwable $e) {
ob_end_clean();
throw $e;
}
}
我试图找到类似
array_shift
的东西,但对于单个变量来说,它只会取消设置值并同时返回它。
免责声明:这仅用于研究目的。恕我直言,引入不必要的
eval
比允许在模板中读取 $templatePath
变量更麻烦。
此解决方案的想法是创建匿名函数,其中模板路径将是常量而不是变量。
$code = <<<CODE
\$f = static function (
ViewComponentEntityInterface \$template,
ViewHelper \$viewHelper
) {
include $templatePath;
}
CODE;
eval($code);
$f($component, $viewHelper);