From 50633b6a15e5be2df2c0c4c4efcc29328aa7c681 Mon Sep 17 00:00:00 2001 From: Rati Wannapanop Date: Mon, 28 Jul 2014 01:49:44 -0500 Subject: [PATCH 1/5] allow mapping input to public properties when the constructor is not defined --- src/Laracasts/Commander/CommanderTrait.php | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/Laracasts/Commander/CommanderTrait.php b/src/Laracasts/Commander/CommanderTrait.php index 8a328f7..d289e0b 100644 --- a/src/Laracasts/Commander/CommanderTrait.php +++ b/src/Laracasts/Commander/CommanderTrait.php @@ -60,7 +60,11 @@ protected function mapInputToCommand($command, array $input) $class = new ReflectionClass($command); - foreach ($class->getConstructor()->getParameters() as $parameter) + $parameters = ($hasConstructor = !is_null($class->getConstructor())) + ? $class->getConstructor()->getParameters() + : $class->getProperties(\ReflectionProperty::IS_PUBLIC); + + foreach ($parameters as $parameter) { $name = $parameter->getName(); @@ -68,7 +72,7 @@ protected function mapInputToCommand($command, array $input) { $dependencies[] = $input[$name]; } - elseif ($parameter->isDefaultValueAvailable()) + elseif ($hasConstructor && $parameter->isDefaultValueAvailable()) { $dependencies[] = $parameter->getDefaultValue(); } @@ -80,5 +84,4 @@ protected function mapInputToCommand($command, array $input) return $class->newInstanceArgs($dependencies); } - } \ No newline at end of file From 04c2459814e3dc68e20e144a998086b52cb32ad4 Mon Sep 17 00:00:00 2001 From: Rati Wannapanop Date: Mon, 28 Jul 2014 10:44:47 -0500 Subject: [PATCH 2/5] create separate function to map input to command public properties --- src/Laracasts/Commander/CommanderTrait.php | 55 +++++++++++++++++++--- 1 file changed, 48 insertions(+), 7 deletions(-) diff --git a/src/Laracasts/Commander/CommanderTrait.php b/src/Laracasts/Commander/CommanderTrait.php index d289e0b..ecddc4d 100644 --- a/src/Laracasts/Commander/CommanderTrait.php +++ b/src/Laracasts/Commander/CommanderTrait.php @@ -56,15 +56,30 @@ public function getCommandBus() */ protected function mapInputToCommand($command, array $input) { - $dependencies = []; - $class = new ReflectionClass($command); - $parameters = ($hasConstructor = !is_null($class->getConstructor())) - ? $class->getConstructor()->getParameters() - : $class->getProperties(\ReflectionProperty::IS_PUBLIC); + if (is_null($class->getConstructor())) { + return $this->mapInputToCommandProperties($command, $input, $class); + } else { + return $this->mapInputToCommandConstructor($command, $input, $class); + } + } + + /** + * Map an array of input to a command's properties via its constructor + * + * @param $command + * @param array $input + * @param $class + * @throws InvalidArgumentException + * + * @return mixed + */ + protected function mapInputToCommandConstructor($command, array $input, $class) + { + $dependencies = []; - foreach ($parameters as $parameter) + foreach ($class->getConstructor()->getParameters() as $parameter) { $name = $parameter->getName(); @@ -72,7 +87,7 @@ protected function mapInputToCommand($command, array $input) { $dependencies[] = $input[$name]; } - elseif ($hasConstructor && $parameter->isDefaultValueAvailable()) + elseif ($parameter->isDefaultValueAvailable()) { $dependencies[] = $parameter->getDefaultValue(); } @@ -84,4 +99,30 @@ protected function mapInputToCommand($command, array $input) return $class->newInstanceArgs($dependencies); } + + /** + * Map an array of input to a command's properties via its public properties + * + * @param $command + * @param array $input + * @param $class + * + * @return mixed + */ + protected function mapInputToCommandProperties($command, array $input, $class) + { + $instance = $class->newInstance(); + + foreach ($class->getProperties(\ReflectionProperty::IS_PUBLIC) as $parameter) + { + $name = $parameter->getName(); + + if (array_key_exists($name, $input)) + { + $instance->$name = $input[$name]; + } + } + + return $instance; + } } \ No newline at end of file From f432167f30b274bbad2c90c56e0291224538aca3 Mon Sep 17 00:00:00 2001 From: Rati Wannapanop Date: Thu, 31 Jul 2014 11:58:36 -0500 Subject: [PATCH 3/5] throw an exception when any public property does not exist in the input --- src/Laracasts/Commander/CommanderTrait.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/Laracasts/Commander/CommanderTrait.php b/src/Laracasts/Commander/CommanderTrait.php index ecddc4d..d954d26 100644 --- a/src/Laracasts/Commander/CommanderTrait.php +++ b/src/Laracasts/Commander/CommanderTrait.php @@ -121,6 +121,10 @@ protected function mapInputToCommandProperties($command, array $input, $class) { $instance->$name = $input[$name]; } + else + { + throw new InvalidArgumentException("Unable to map input to command: {$name}"); + } } return $instance; From 196555f354d4e4df13a8f60a2627aa6992e768c0 Mon Sep 17 00:00:00 2001 From: Rati Wannapanop Date: Thu, 31 Jul 2014 12:00:49 -0500 Subject: [PATCH 4/5] remove unused argument --- src/Laracasts/Commander/CommanderTrait.php | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/Laracasts/Commander/CommanderTrait.php b/src/Laracasts/Commander/CommanderTrait.php index d954d26..c52c0c4 100644 --- a/src/Laracasts/Commander/CommanderTrait.php +++ b/src/Laracasts/Commander/CommanderTrait.php @@ -59,23 +59,22 @@ protected function mapInputToCommand($command, array $input) $class = new ReflectionClass($command); if (is_null($class->getConstructor())) { - return $this->mapInputToCommandProperties($command, $input, $class); + return $this->mapInputToCommandProperties($input, $class); } else { - return $this->mapInputToCommandConstructor($command, $input, $class); + return $this->mapInputToCommandConstructor($input, $class); } } /** * Map an array of input to a command's properties via its constructor * - * @param $command * @param array $input * @param $class * @throws InvalidArgumentException * * @return mixed */ - protected function mapInputToCommandConstructor($command, array $input, $class) + protected function mapInputToCommandConstructor(array $input, $class) { $dependencies = []; @@ -103,13 +102,12 @@ protected function mapInputToCommandConstructor($command, array $input, $class) /** * Map an array of input to a command's properties via its public properties * - * @param $command * @param array $input * @param $class * * @return mixed */ - protected function mapInputToCommandProperties($command, array $input, $class) + protected function mapInputToCommandProperties(array $input, $class) { $instance = $class->newInstance(); From a514cef62d5e1546aaa9161e62431715cababbb7 Mon Sep 17 00:00:00 2001 From: Bruno Barros Date: Mon, 4 Aug 2014 23:51:30 -0300 Subject: [PATCH 5/5] prevent throw exception if has default value prevent throw exception if parameter has default value --- src/Laracasts/Commander/CommanderTrait.php | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/Laracasts/Commander/CommanderTrait.php b/src/Laracasts/Commander/CommanderTrait.php index c52c0c4..0e16c72 100644 --- a/src/Laracasts/Commander/CommanderTrait.php +++ b/src/Laracasts/Commander/CommanderTrait.php @@ -121,10 +121,14 @@ protected function mapInputToCommandProperties(array $input, $class) } else { - throw new InvalidArgumentException("Unable to map input to command: {$name}"); + // if parameter has no default value + if(is_null($instance->$name)) + { + throw new InvalidArgumentException("Unable to map input to command: {$name}"); + } } } return $instance; } -} \ No newline at end of file +}