Browse Source

Merge pull request #1845 from stevenklar/master

Add unregister IoC
Taylor Otwell 11 years ago
parent
commit
5dd3ec6f1e
3 changed files with 42 additions and 4 deletions
  1. 10 1
      laravel/documentation/ioc.md
  2. 18 3
      laravel/ioc.php
  3. 14 0
      laravel/tests/cases/ioc.test.php

+ 10 - 1
laravel/documentation/ioc.md

@@ -46,4 +46,13 @@ Now that we have SwiftMailer registered in the container, we can resolve it usin
 
 
 	$mailer = IoC::resolve('mailer');
 	$mailer = IoC::resolve('mailer');
 
 
-> **Note:** You may also [register controllers in the container](/docs/controllers#dependency-injection).
+> **Note:** You may also [register controllers in the container](/docs/controllers#dependency-injection).
+
+<a name="unregister"></a>
+## Unregister an existing instance
+
+For test purposes sometimes you need to unregister some container.
+
+#### Unregister example mail class:
+
+    IoC::unregister('mailer');

+ 18 - 3
laravel/ioc.php

@@ -31,6 +31,19 @@ class IoC {
 		static::$registry[$name] = compact('resolver', 'singleton');
 		static::$registry[$name] = compact('resolver', 'singleton');
 	}
 	}
 
 
+    /**
+     * Unregister an object
+     *
+     * @param string $name
+     */
+    public static function unregister($name)
+    {
+        if (array_key_exists($name, static::$registry)) {
+            unset(static::$registry[$name]);
+            unset(static::$singletons[$name]);
+        }
+    }
+
 	/**
 	/**
 	 * Determine if an object has been registered in the container.
 	 * Determine if an object has been registered in the container.
 	 *
 	 *
@@ -141,6 +154,7 @@ class IoC {
 	 * @param  string  $type
 	 * @param  string  $type
 	 * @param  array   $parameters
 	 * @param  array   $parameters
 	 * @return mixed
 	 * @return mixed
+     * @throws \Exception
 	 */
 	 */
 	protected static function build($type, $parameters = array())
 	protected static function build($type, $parameters = array())
 	{
 	{
@@ -193,7 +207,7 @@ class IoC {
 			$dependency = $parameter->getClass();
 			$dependency = $parameter->getClass();
 
 
 			// If the person passed in some parameters to the class
 			// If the person passed in some parameters to the class
-			// then we should probably use those instead of trying 
+			// then we should probably use those instead of trying
 			// to resolve a new instance of the class
 			// to resolve a new instance of the class
 			if (count($arguments) > 0)
 			if (count($arguments) > 0)
 			{
 			{
@@ -205,7 +219,7 @@ class IoC {
 			}
 			}
 			else
 			else
 			{
 			{
-				$dependencies[] = static::resolve($dependency->name);				
+				$dependencies[] = static::resolve($dependency->name);
 			}
 			}
 		}
 		}
 
 
@@ -218,6 +232,7 @@ class IoC {
 	 *
 	 *
 	 * @param ReflectionParameter
 	 * @param ReflectionParameter
 	 * @return default value
 	 * @return default value
+     * @throws \Exception
 	 */
 	 */
 	protected static function resolveNonClass($parameter)
 	protected static function resolveNonClass($parameter)
 	{
 	{
@@ -229,6 +244,6 @@ class IoC {
 		{
 		{
 			throw new \Exception("Unresolvable dependency resolving [$parameter].");
 			throw new \Exception("Unresolvable dependency resolving [$parameter].");
 		}
 		}
-	}	
+	}
 
 
 }
 }

+ 14 - 0
laravel/tests/cases/ioc.test.php

@@ -28,6 +28,7 @@ class TestClassTwoForIoC
 	}
 	}
 }
 }
 
 
+use \Laravel\IoC as IoC;
 
 
 class IoCTest extends PHPUnit_Framework_TestCase {
 class IoCTest extends PHPUnit_Framework_TestCase {
 
 
@@ -150,4 +151,17 @@ class IoCTest extends PHPUnit_Framework_TestCase {
 		$this->assertEquals(42, $class_two->class_one->test_variable);
 		$this->assertEquals(42, $class_two->class_one->test_variable);
 	}
 	}
 
 
+    public function testCanUnregisterRegistered()
+    {
+        $testClass = 'test';
+
+        IoC::register($testClass, function() {});
+
+        $this->assertTrue(IoC::registered($testClass));
+
+        IoC::unregister($testClass);
+
+        $this->assertFalse(IoC::registered($testClass));
+    }
+
 }
 }