diff --git a/laravel/ioc.php b/laravel/ioc.php index 4347cbcb..31a1b6a5 100644 --- a/laravel/ioc.php +++ b/laravel/ioc.php @@ -172,7 +172,7 @@ protected static function build($type, $parameters = array()) return new $type; } - $dependencies = static::dependencies($constructor->getParameters()); + $dependencies = static::dependencies($constructor->getParameters(), $parameters); return $reflector->newInstanceArgs($dependencies); } @@ -181,9 +181,10 @@ protected static function build($type, $parameters = array()) * Resolve all of the dependencies from the ReflectionParameters. * * @param array $parameters + * @param array $arguments that might have been passed into our resolve * @return array */ - protected static function dependencies($parameters) + protected static function dependencies($parameters, $arguments) { $dependencies = array(); @@ -191,18 +192,43 @@ protected static function dependencies($parameters) { $dependency = $parameter->getClass(); - // If the class is null, it means the dependency is a string or some other - // primitive type, which we can not resolve since it is not a class and - // we'll just bomb out with an error since we have nowhere to go. - if (is_null($dependency)) + // If the person passed in some parameters to the class + // then we should probably use those instead of trying + // to resolve a new instance of the class + if (count($arguments) > 0) { - throw new \Exception("Unresolvable dependency resolving [$parameter]."); + $dependencies[] = array_shift($arguments); + } + else if (is_null($dependency)) + { + $dependency[] = static::resolveNonClass($parameter); + } + else + { + $dependencies[] = static::resolve($dependency->name); } - - $dependencies[] = static::resolve($dependency->name); } return (array) $dependencies; } + /** + * Resolves optional parameters for our dependency injection + * pretty much took backport straight from L4's Illuminate\Container + * + * @param ReflectionParameter + * @return default value + */ + protected static function resolveNonClass($parameter) + { + if ($parameter->isDefaultValueAvailable()) + { + return $parameter->getDefaultValue(); + } + else + { + throw new \Exception("Unresolvable dependency resolving [$parameter]."); + } + } + } \ No newline at end of file diff --git a/laravel/tests/cases/ioc.test.php b/laravel/tests/cases/ioc.test.php index 56918337..a93442dd 100644 --- a/laravel/tests/cases/ioc.test.php +++ b/laravel/tests/cases/ioc.test.php @@ -1,5 +1,34 @@ class_one = $class_one; + } +} + + class IoCTest extends PHPUnit_Framework_TestCase { /** @@ -71,4 +100,54 @@ public function testControllerMethodRegistersAController() $this->assertTrue(IoC::registered('controller: ioc.test')); } + /** + * Test that classes with optional parameters can resolve + */ + public function testOptionalParamClassResolves() + { + $test = IoC::resolve('TestOptionalParamClassForIoC'); + $this->assertInstanceOf('TestOptionalParamClassForIoC', $test); + } + + /** + * Test that we can resolve TestClassOneForIoC using IoC + */ + public function testClassOneForIoCResolves() + { + $test = IoC::resolve('TestClassOneForIoC'); + $this->assertInstanceOf('TestClassOneForIoC', $test); + } + + /** + * Test that we can resolve TestClassTwoForIoC + */ + public function testClassTwoForIoCResolves() + { + $test = IoC::resolve('TestClassTwoForIoC'); + $this->assertInstanceOf('TestClassTwoForIoC', $test); + } + + /** + * Test that when we resolve TestClassTwoForIoC we auto resolve + * the dependency for TestClassOneForIoC + */ + public function testClassTwoResolvesClassOneDependency() + { + $test = IoC::resolve('TestClassTwoForIoC'); + $this->assertInstanceOf('TestClassOneForIoC', $test->TestClassOneForIoC); + } + + /** + * Test that when we resolve TestClassTwoForIoC with a parameter + * that it actually uses that instead of a blank class TestClassOneForIoC + */ + public function testClassTwoResolvesClassOneWithArgument() + { + $class_one = IoC::resolve('TestClassOneForIoC'); + $class_one->test_variable = 42; + + $class_two = IoC::resolve('TestClassTwoForIoC', [$class_one]); + $this->assertEquals(42, $class_two->class_one->test_variable); + } + } \ No newline at end of file