diff --git a/src/TwigComponent/src/ComponentAttributes.php b/src/TwigComponent/src/ComponentAttributes.php index 39213d945f..bea7876dfd 100644 --- a/src/TwigComponent/src/ComponentAttributes.php +++ b/src/TwigComponent/src/ComponentAttributes.php @@ -37,48 +37,43 @@ public function __construct(private array $attributes) public function __toString(): string { - return array_reduce( - array_filter( - array_keys($this->attributes), - fn (string $key) => !isset($this->rendered[$key]) - ), - function (string $carry, string $key) { - if ( - str_contains($key, ':') - && preg_match(self::NESTED_REGEX, $key) - && !preg_match(self::ALPINE_REGEX, $key) - && !preg_match(self::VUE_REGEX, $key) - ) { - return $carry; - } - - $value = $this->attributes[$key]; - - if ($value instanceof \Stringable) { - $value = (string) $value; - } - - if (!\is_scalar($value) && null !== $value) { - throw new \LogicException(\sprintf('A "%s" prop was passed when creating the component. No matching "%s" property or mount() argument was found, so we attempted to use this as an HTML attribute. But, the value is not a scalar (it\'s a "%s"). Did you mean to pass this to your component or is there a typo on its name?', $key, $key, get_debug_type($value))); - } - - if (null === $value) { - trigger_deprecation('symfony/ux-twig-component', '2.8.0', 'Passing "null" as an attribute value is deprecated and will throw an exception in 3.0.'); - $value = true; - } - - if (true === $value && str_starts_with($key, 'aria-')) { - $value = 'true'; - } - - return match ($value) { - true => "{$carry} {$key}", - false => $carry, - default => \sprintf('%s %s="%s"', $carry, $key, $value), - }; - }, - '' - ); + $attributes = ''; + + foreach ($this->attributes as $key => $value) { + if (isset($this->rendered[$key])) { + continue; + } + + if ( + str_contains($key, ':') + && preg_match(self::NESTED_REGEX, $key) + && !preg_match(self::ALPINE_REGEX, $key) + && !preg_match(self::VUE_REGEX, $key) + ) { + continue; + } + + if (null === $value) { + trigger_deprecation('symfony/ux-twig-component', '2.8.0', 'Passing "null" as an attribute value is deprecated and will throw an exception in 3.0.'); + $value = true; + } + + if (!\is_scalar($value) && !($value instanceof \Stringable)) { + throw new \LogicException(\sprintf('A "%s" prop was passed when creating the component. No matching "%s" property or mount() argument was found, so we attempted to use this as an HTML attribute. But, the value is not a scalar (it\'s a "%s"). Did you mean to pass this to your component or is there a typo on its name?', $key, $key, get_debug_type($value))); + } + + if (true === $value && str_starts_with($key, 'aria-')) { + $value = 'true'; + } + + $attributes .= match ($value) { + true => ' '.$key, + false => '', + default => \sprintf(' %s="%s"', $key, $value), + }; + } + + return $attributes; } public function __clone(): void