diff --git a/src/TwigComponent/src/Twig/TwigPreLexer.php b/src/TwigComponent/src/Twig/TwigPreLexer.php index ed1a4b3faac..2aae143a9a3 100644 --- a/src/TwigComponent/src/Twig/TwigPreLexer.php +++ b/src/TwigComponent/src/Twig/TwigPreLexer.php @@ -58,9 +58,13 @@ public function preLexComponents(string $input): string $this->currentComponents[] = ['name' => $componentName, 'hasDefaultBlock' => false]; } - $output .= "{% component '{$componentName}'".($attributes ? " with { {$attributes} }" : '').' %}'; if ($isSelfClosing) { - $output .= '{% endcomponent %}'; + // use the simpler component() format, so that the system doesn't think + // this is an "embedded" component with blocks + // see https://github.com/symfony/ux/issues/810 + $output .= "{{ component('{$componentName}'".($attributes ? ", { {$attributes} }" : '').') }}'; + } else { + $output .= "{% component '{$componentName}'".($attributes ? " with { {$attributes} }" : '').' %}'; } continue; diff --git a/src/TwigComponent/tests/Unit/TwigPreLexerTest.php b/src/TwigComponent/tests/Unit/TwigPreLexerTest.php index 80347b2b3fd..8220d29f96a 100644 --- a/src/TwigComponent/tests/Unit/TwigPreLexerTest.php +++ b/src/TwigComponent/tests/Unit/TwigPreLexerTest.php @@ -29,17 +29,17 @@ public function getLexTests(): iterable { yield 'simple_component' => [ '', - '{% component \'foo\' %}{% endcomponent %}', + '{{ component(\'foo\') }}', ]; yield 'component_with_attributes' => [ '', - "{% component 'foo' with { bar: 'baz', with_quotes: 'It\'s with quotes' } %}{% endcomponent %}", + "{{ component('foo', { bar: 'baz', with_quotes: 'It\'s with quotes' }) }}", ]; yield 'component_with_dynamic_attributes' => [ '', - '{% component \'foo\' with { dynamic: dynamicVar, otherDynamic: anotherVar } %}{% endcomponent %}', + '{{ component(\'foo\', { dynamic: dynamicVar, otherDynamic: anotherVar }) }}', ]; yield 'component_with_closing_tag' => [ @@ -54,12 +54,12 @@ public function getLexTests(): iterable yield 'component_with_embedded_component_inside_block' => [ '', - '{% component \'foo\' %}{% block foo_block %}{% component \'bar\' %}{% endcomponent %}{% endblock %}{% endcomponent %}', + '{% component \'foo\' %}{% block foo_block %}{{ component(\'bar\') }}{% endblock %}{% endcomponent %}', ]; yield 'attribute_with_no_value' => [ '', - '{% component \'foo\' with { bar: true } %}{% endcomponent %}', + '{{ component(\'foo\', { bar: true }) }}', ]; yield 'component_with_default_block_content' => [ @@ -69,7 +69,7 @@ public function getLexTests(): iterable yield 'component_with_default_block_that_holds_a_component_and_multi_blocks' => [ 'Foo Other block', - '{% component \'foo\' %}{% block content %}Foo {% component \'bar\' %}{% endcomponent %}{% endblock %}{% block other_block %}Other block{% endblock %}{% endcomponent %}', + '{% component \'foo\' %}{% block content %}Foo {{ component(\'bar\') }}{% endblock %}{% block other_block %}Other block{% endblock %}{% endcomponent %}', ]; yield 'component_with_character_:_on_his_name' => [ '',