diff --git a/core/lib/Drupal/Core/Template/TwigExtension.php b/core/lib/Drupal/Core/Template/TwigExtension.php
index 9d6dd1a4467..693da9a2ae5 100644
--- a/core/lib/Drupal/Core/Template/TwigExtension.php
+++ b/core/lib/Drupal/Core/Template/TwigExtension.php
@@ -534,7 +534,7 @@ class TwigExtension extends \Twig_Extension {
*
* @param \Twig_Environment $env
* A Twig_Environment instance.
- * @param mixed[]|\Traversable $value
+ * @param mixed[]|\Traversable|NULL $value
* The pieces to join.
* @param string $glue
* The delimiter with which to join the string. Defaults to an empty string.
@@ -545,10 +545,14 @@ class TwigExtension extends \Twig_Extension {
* The strings joined together.
*/
public function safeJoin(\Twig_Environment $env, $value, $glue = '') {
+ if ($value instanceof \Traversable) {
+ $value = iterator_to_array($value, false);
+ }
+
return implode($glue, array_map(function($item) use ($env) {
// If $item is not marked safe then it will be escaped.
return $this->escapeFilter($env, $item, 'html', NULL, TRUE);
- }, $value));
+ }, (array) $value));
}
}
diff --git a/core/tests/Drupal/Tests/Core/Template/TwigExtensionTest.php b/core/tests/Drupal/Tests/Core/Template/TwigExtensionTest.php
index 6b9525ea6e8..cb09022c430 100644
--- a/core/tests/Drupal/Tests/Core/Template/TwigExtensionTest.php
+++ b/core/tests/Drupal/Tests/Core/Template/TwigExtensionTest.php
@@ -200,6 +200,20 @@ class TwigExtensionTest extends UnitTestCase {
];
$result = $twig_extension->safeJoin($twig_environment, $items, '
');
$this->assertEquals('<em>will be escaped</em>
will be markup
will be rendered', $result);
+
+ // Ensure safe_join Twig filter supports Traversable variables.
+ $items = new \ArrayObject([
+ 'will be escaped',
+ $markup,
+ ['#markup' => 'will be rendered'],
+ ]);
+ $result = $twig_extension->safeJoin($twig_environment, $items, ', ');
+ $this->assertEquals('<em>will be escaped</em>, will be markup, will be rendered', $result);
+
+ // Ensure safe_join Twig filter supports empty variables.
+ $items = NULL;
+ $result = $twig_extension->safeJoin($twig_environment, $items, '
');
+ $this->assertEmpty($result);
}
/**