Skip to content

Commit

Permalink
Throw if non-array is given for a named variadic (#28)
Browse files Browse the repository at this point in the history
  • Loading branch information
samdark committed Nov 30, 2021
1 parent 76d43e8 commit ace6207
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 4 deletions.
13 changes: 9 additions & 4 deletions src/ArrayDefinition.php
Expand Up @@ -4,6 +4,7 @@

namespace Yiisoft\Definitions;

use InvalidArgumentException;
use Psr\Container\ContainerInterface;
use Yiisoft\Definitions\Contract\DefinitionInterface;
use Yiisoft\Definitions\Exception\InvalidConfigException;
Expand Down Expand Up @@ -191,10 +192,14 @@ private function injectArguments(array &$dependencies, array $arguments): void
}
unset($value);
if ($variadicKey !== null) {
if (!$isIntegerIndexed && isset($arguments[$variadicKey]) && is_array($arguments[$variadicKey])) {
unset($dependencies[$variadicKey]);
$dependencies += $arguments[$variadicKey];
return;
if (!$isIntegerIndexed && isset($arguments[$variadicKey])) {
if (is_array($arguments[$variadicKey])) {
unset($dependencies[$variadicKey]);
$dependencies += $arguments[$variadicKey];
return;
}

throw new InvalidArgumentException(sprintf('Named argument for a variadic parameter should be an array, "%s" given.', gettype($arguments[$variadicKey])));
}

/** @var mixed $value */
Expand Down
21 changes: 21 additions & 0 deletions tests/Unit/ArrayDefinitionTest.php
Expand Up @@ -4,6 +4,7 @@

namespace Yiisoft\Definitions\Tests\Unit;

use InvalidArgumentException;
use PHPUnit\Framework\TestCase;
use Yiisoft\Definitions\ArrayDefinition;
use Yiisoft\Definitions\Exception\InvalidConfigException;
Expand Down Expand Up @@ -125,6 +126,26 @@ public function testConstructorWithVariadicAndNamedKeys(): void
self::assertSame($colors, $phone->getColors());
}

public function testConstructorWithWrongVariadicArgument(): void
{
$container = new SimpleContainer();

$colors = 'red';
$definition = ArrayDefinition::fromConfig([
ArrayDefinition::CLASS_NAME => Phone::class,
ArrayDefinition::CONSTRUCTOR => [
'name' => null,
'version' => null,
'colors' => $colors,
],
]);

$this->expectException(InvalidArgumentException::class);
$this->expectExceptionMessage('Named argument for a variadic parameter should be an array, "string" given.');

$definition->resolve($container);
}

public function dataSetProperties(): array
{
return [
Expand Down

0 comments on commit ace6207

Please sign in to comment.