diff --git a/src/ViewTrait.php b/src/ViewTrait.php index 8a92e98d9..944a608db 100644 --- a/src/ViewTrait.php +++ b/src/ViewTrait.php @@ -88,6 +88,16 @@ public function withBasePath(string|null $basePath): static public function withRenderers(array $renderers): static { foreach ($renderers as $extension => $renderer) { + if (!is_string($extension)) { + throw new InvalidArgumentException( + sprintf( + 'Extension must be a non-empty string, %s provided for %s.', + get_debug_type($extension), + $renderer::class + ) + ); + } + if ($extension === '') { throw new InvalidArgumentException( sprintf( diff --git a/tests/ViewTest.php b/tests/ViewTest.php index cb4ef35fa..f1c519a11 100644 --- a/tests/ViewTest.php +++ b/tests/ViewTest.php @@ -262,6 +262,34 @@ public function testWithRenderersInvalidRendererTypeThrowsException(): void ]); } + public function testWithRenderersNumericKeyImplicitThrowsException(): void + { + $view = TestHelper::createView(); + + $this->expectException(InvalidArgumentException::class); + $this->expectExceptionMessage( + 'Extension must be a non-empty string, int provided for ' . PhpTemplateRenderer::class . '.' + ); + + $view->withRenderers([ + new PhpTemplateRenderer(), + ]); + } + + public function testWithRenderersNumericKeyExplicitThrowsException(): void + { + $view = TestHelper::createView(); + + $this->expectException(InvalidArgumentException::class); + $this->expectExceptionMessage( + 'Extension must be a non-empty string, int provided for ' . PhpTemplateRenderer::class . '.' + ); + + $view->withRenderers([ + 0 => new PhpTemplateRenderer(), + ]); + } + public function testLocalize(): void { $view = $this->createViewWithBasePath($this->tempDirectory); @@ -628,7 +656,7 @@ public function testImmutability(): void $view = TestHelper::createView(); $this->assertNotSame($view, $view->withBasePath('')); - $this->assertNotSame($view, $view->withRenderers([new PhpTemplateRenderer()])); + $this->assertNotSame($view, $view->withRenderers(['php' => new PhpTemplateRenderer()])); $this->assertNotSame($view, $view->withSourceLocale('en')); $this->assertNotSame($view, $view->withContext($this->createContext($this->tempDirectory))); $this->assertNotSame($view, $view->withContextPath(__DIR__));