Add Command->parameters() method to introspect arguments

This commit is contained in:
Chris 2025-01-17 01:05:58 +01:00
parent bf8e95561e
commit 474ccbb012
2 changed files with 39 additions and 1 deletions

View File

@ -2,6 +2,8 @@
namespace NoccyLabs\React\CommandBus; namespace NoccyLabs\React\CommandBus;
use ReflectionFunction;
use ReflectionNamedType;
use React\Promise\Deferred; use React\Promise\Deferred;
use React\Promise\Promise; use React\Promise\Promise;
use React\Promise\PromiseInterface; use React\Promise\PromiseInterface;
@ -38,5 +40,31 @@ class Command
}); });
} }
public function parameters(): array
{
$refl = new ReflectionFunction($this->handler);
$args = [];
foreach ($refl->getParameters() as $parameter) {
$name = $parameter->getName();
$type = null;
if (!$parameter->hasType()) {
$type = 'any';
} else {
$type = $parameter->getType();
if ($type instanceof ReflectionNamedType && $type->isBuiltin()) {
$type = $type->getName();
} else {
$type = null;
}
}
if ($parameter->isOptional()) $type = "?{$type}";
if ($type !== null) $args[$name] = $type;
}
return $args;
}
} }

View File

@ -26,4 +26,14 @@ class CommandTest extends \PHPUnit\Framework\TestCase
$this->assertEquals(true, $hit); $this->assertEquals(true, $hit);
} }
} public function testCommandReflection()
{
$command = new Command("test", function (string $a, ?int $b, bool $c = false) { });
$expect = [
'a' => 'string',
'b' => 'int',
'c' => '?bool'
];
$this->assertEquals($expect, $command->parameters());
}
}