diff --git a/CHANGELOG b/CHANGELOG index 510a84bab3..7e9ad26144 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,5 +1,6 @@ * 1.38.0 (2019-XX-XX) + * fixed "embed" support when used from "template_from_string" * added the possibility to pass a TemplateWrapper to Twig\Environment::load() * improved the performance of the sandbox * added a spaceless filter diff --git a/src/Environment.php b/src/Environment.php index 4a953fa865..968309946f 100644 --- a/src/Environment.php +++ b/src/Environment.php @@ -351,7 +351,7 @@ public function getTemplateClass($name, $index = null) { $key = $this->getLoader()->getCacheKey($name).$this->optionsHash; - return $this->templateClassPrefix.hash('sha256', $key).(null === $index ? '' : '_'.$index); + return $this->templateClassPrefix.hash('sha256', $key).(null === $index ? '' : '___'.$index); } /** @@ -443,9 +443,17 @@ public function load($name) */ public function loadTemplate($name, $index = null) { - $cls = $mainCls = $this->getTemplateClass($name); + return $this->loadClass($this->getTemplateClass($name), $name, $index); + } + + /** + * @internal + */ + public function loadClass($cls, $name, $index = null) + { + $mainCls = $cls; if (null !== $index) { - $cls .= '_'.$index; + $cls .= '___'.$index; } if (isset($this->loadedTemplates[$cls])) { @@ -491,7 +499,7 @@ public function loadTemplate($name, $index = null) } if (!class_exists($cls, false)) { - throw new RuntimeError(sprintf('Failed to load Twig template "%s", index "%s": cache is corrupted.', $name, $index), -1, $source); + throw new RuntimeError(sprintf('Failed to load Twig template "%s", index "%s": cache might be corrupted.', $name, $index), -1, $source); } } diff --git a/src/Template.php b/src/Template.php index 013e926128..8889c024dd 100644 --- a/src/Template.php +++ b/src/Template.php @@ -351,6 +351,15 @@ protected function loadTemplate($template, $templateName = null, $line = null, $ return $template; } + if ($template === $this->getTemplateName()) { + $class = get_class($this); + if (false !== $pos = strrpos($class, '___', -1)) { + $class = substr($class, 0, $pos); + } + + return $this->env->loadClass($class, $template, $index); + } + return $this->env->loadTemplate($template, $index); } catch (Error $e) { if (!$e->getSourceContext()) { diff --git a/test/Twig/Tests/Fixtures/functions/include_template_from_string.test b/test/Twig/Tests/Fixtures/functions/include_template_from_string.test new file mode 100644 index 0000000000..8d9ba60ce6 --- /dev/null +++ b/test/Twig/Tests/Fixtures/functions/include_template_from_string.test @@ -0,0 +1,11 @@ +--TEST-- +"template_from_string" function works in an "include" +--TEMPLATE-- +{% set embed = '{% embed "embed.twig" %}{% endembed %}' %} +{{ include(template_from_string(embed)) }} +--TEMPLATE(embed.twig)-- +Cool +--DATA-- +return [] +--EXPECT-- +Cool