diff --git a/change-log.md b/change-log.md index e0e568fd5..df95a8754 100644 --- a/change-log.md +++ b/change-log.md @@ -2,6 +2,10 @@ ## 6.0 +Improvements: + +- The container can now be built without parameters: `new Container()` + BC breaks: - The deprecated `DI\link()` helper was removed, used `DI\get()` instead diff --git a/doc/container-configuration.md b/doc/container-configuration.md index d3462e4c8..d1d40748d 100644 --- a/doc/container-configuration.md +++ b/doc/container-configuration.md @@ -11,6 +11,8 @@ PHP-DI's container is preconfigured for "plug'n'play", i.e. development environm ```php $container = ContainerBuilder::buildDevContainer(); +// same as +$container = new Container(); ``` By default, PHP-DI will have [Autowiring](definition.md) enabled (annotations are disabled by default). diff --git a/doc/getting-started.md b/doc/getting-started.md index 9a2fe7c50..f20323f8b 100644 --- a/doc/getting-started.md +++ b/doc/getting-started.md @@ -61,13 +61,13 @@ As we can see, the `UserManager` takes the `Mailer` as a constructor parameter: ### 2. Create the container -You can create a container instance preconfigured for development very easily: +You can create a container instance pre-configured for development very easily: ```php -$container = DI\ContainerBuilder::buildDevContainer(); +$container = new Container(); ``` -If you want to register definition files (explained below) or tweak some options, you can use the container builder: +If you want to register definition files (explained in [PHP definitions](php-definitions.md)) or tweak some options, you can use the [container builder](container-configuration.md): ```php $builder = new DI\ContainerBuilder(); diff --git a/src/DI/Container.php b/src/DI/Container.php index b35171428..675f8ebd1 100644 --- a/src/DI/Container.php +++ b/src/DI/Container.php @@ -9,9 +9,12 @@ use DI\Definition\ObjectDefinition; use DI\Definition\Resolver\DefinitionResolver; use DI\Definition\Resolver\ResolverDispatcher; +use DI\Definition\Source\Autowiring; use DI\Definition\Source\CachedDefinitionSource; +use DI\Definition\Source\DefinitionArray; use DI\Definition\Source\DefinitionSource; use DI\Definition\Source\MutableDefinitionSource; +use DI\Definition\Source\SourceChain; use DI\Invoker\DefinitionParameterResolver; use DI\Proxy\ProxyFactory; use Exception; @@ -66,22 +69,24 @@ class Container implements ContainerInterface, FactoryInterface, \DI\InvokerInte private $wrapperContainer; /** - * Use the ContainerBuilder to ease constructing the Container. + * Use `$container = new Container()` if you want a container with the default configuration. + * + * If you want to customize the container's behavior, you are discouraged to create and pass the + * dependencies yourself, the ContainerBuilder class is here to help you instead. * * @see ContainerBuilder * - * @param DefinitionSource $definitionSource - * @param ProxyFactory $proxyFactory * @param ContainerInterface $wrapperContainer If the container is wrapped by another container. */ public function __construct( - DefinitionSource $definitionSource, - ProxyFactory $proxyFactory, + DefinitionSource $definitionSource = null, + ProxyFactory $proxyFactory = null, ContainerInterface $wrapperContainer = null ) { $this->wrapperContainer = $wrapperContainer ?: $this; - $this->definitionSource = $definitionSource; + $this->definitionSource = $definitionSource ?: $this->createDefaultDefinitionSource(); + $proxyFactory = $proxyFactory ?: new ProxyFactory(false); $this->definitionResolver = new ResolverDispatcher($this->wrapperContainer, $proxyFactory); // Auto-register the container @@ -331,4 +336,15 @@ private function getInvoker() return $this->invoker; } + + /** + * @return DefinitionSource + */ + private function createDefaultDefinitionSource() + { + $source = new SourceChain([new Autowiring]); + $source->setMutableDefinitionSource(new DefinitionArray); + + return $source; + } } diff --git a/src/DI/ContainerBuilder.php b/src/DI/ContainerBuilder.php index 7dc202105..d8cfa530f 100644 --- a/src/DI/ContainerBuilder.php +++ b/src/DI/ContainerBuilder.php @@ -91,9 +91,7 @@ class ContainerBuilder */ public static function buildDevContainer() { - $builder = new self(); - - return $builder->build(); + return new Container; } /** diff --git a/src/DI/Proxy/ProxyFactory.php b/src/DI/Proxy/ProxyFactory.php index 6bf435bda..10fc2e9dd 100644 --- a/src/DI/Proxy/ProxyFactory.php +++ b/src/DI/Proxy/ProxyFactory.php @@ -37,7 +37,7 @@ class ProxyFactory */ private $proxyManager; - public function __construct($writeProxiesToFile, $proxyDirectory = null) + public function __construct($writeProxiesToFile = false, $proxyDirectory = null) { $this->writeProxiesToFile = $writeProxiesToFile; $this->proxyDirectory = $proxyDirectory; diff --git a/tests/UnitTest/ContainerBuilderTest.php b/tests/UnitTest/ContainerBuilderTest.php index 173f32df6..a3609eaec 100644 --- a/tests/UnitTest/ContainerBuilderTest.php +++ b/tests/UnitTest/ContainerBuilderTest.php @@ -2,6 +2,7 @@ namespace DI\Test\UnitTest; +use DI\Container; use DI\ContainerBuilder; use DI\Definition\Source\CachedDefinitionSource; use DI\Definition\Source\DefinitionArray; @@ -201,4 +202,12 @@ public function should_throw_if_modified_after_building_a_container() $builder->addDefinitions([]); } + + /** + * @test + */ + public function dev_container_configuration_should_be_identical_to_creating_a_new_container_from_defaults() + { + self::assertEquals(new Container, ContainerBuilder::buildDevContainer()); + } } diff --git a/tests/UnitTest/ContainerTest.php b/tests/UnitTest/ContainerTest.php index 9a5a9ecbc..991a591f3 100644 --- a/tests/UnitTest/ContainerTest.php +++ b/tests/UnitTest/ContainerTest.php @@ -113,4 +113,12 @@ public function testSetGetSetGet() $this->assertSame('hello', $container->get('foo')); } + + /** + * @test + */ + public function canBeBuiltWithoutParameters() + { + self::assertInstanceOf(Container::class, new Container); // Should not be an error + } }