绝对防止输出缓冲区内容污染

问题描述 投票:0回答:1

我有以下代码,基本上可以渲染部分内容。然而,我试图找到一种方法来防止将

$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
的东西,但对于单个变量来说,它只会取消设置值并同时返回它。

php scope template-engine output-buffering
1个回答
0
投票

免责声明:这仅用于研究目的。恕我直言,引入不必要的

eval
比允许在模板中读取
$templatePath
变量更麻烦。

此解决方案的想法是创建匿名函数,其中模板路径将是常量而不是变量。

$code = <<<CODE
\$f = static function (
    ViewComponentEntityInterface \$template,
    ViewHelper \$viewHelper
) {
   include $templatePath; 
}
CODE;
eval($code);
$f($component, $viewHelper);
© www.soinside.com 2019 - 2024. All rights reserved.