Symfony Twig ArrayLoader沙箱化问题:getPath()返回空字符串
问题原因
ArrayLoader 是基于内存数组存储模板内容的,它返回的 Source 对象本身就没有实际文件路径,所以调用 getPath() 自然会返回空字符串——因为从一开始就不存在对应的物理文件路径。
解决方案
方案一:直接使用模板名称(推荐)
既然用 ArrayLoader 定义了模板名称 test1.html.twig,直接在 include 标签里使用这个名称即可,完全不需要调用 getPath():
$loader = new \Twig\Loader\ArrayLoader([ 'test1.html.twig' => $this->getMessageObject()->getBody() ]); $twig = new \Twig\Environment($loader); // 直接使用模板名称进行include,无需getPath() $output = "{% sandbox %}{% include 'test1.html.twig' %} {% endsandbox %}";
方案二:改用FilesystemLoader(适合需要实际文件路径的场景)
如果业务逻辑必须依赖文件路径,可以先把模板内容写入临时文件,再用 FilesystemLoader 加载:
// 1. 将模板内容写入临时文件 $tempFile = tempnam(sys_get_temp_dir(), 'twig_'); file_put_contents($tempFile, $this->getMessageObject()->getBody()); $templateName = basename($tempFile); // 2. 用FilesystemLoader加载临时文件所在目录 $loader = new \Twig\Loader\FilesystemLoader(sys_get_temp_dir()); $twig = new \Twig\Environment($loader); // 3. 此时getPath()就能拿到实际文件路径 $sourcePath = $twig->getLoader()->getSourceContext($templateName)->getPath(); $output = "{% sandbox %}{% include ('".$sourcePath."') %} {% endsandbox %}"; // 记得用完临时文件后删除(可选,根据业务需求) unlink($tempFile);
内容的提问来源于stack exchange,提问作者saimcan
相关产品推荐
相关产品推荐

