Skip to content

Commit

Permalink
Allow to build the container without parameters
Browse files Browse the repository at this point in the history
All parameters in the constructor are now optional. We can build the container like this:

```php
$container = new Container();
```

This is the same as `ContainerBuilder::buildDevContainer()`, but simpler.
  • Loading branch information
mnapoli committed Jan 1, 2017
1 parent a26e961 commit 572e03a
Show file tree
Hide file tree
Showing 8 changed files with 49 additions and 13 deletions.
4 changes: 4 additions & 0 deletions change-log.md
Expand Up @@ -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
Expand Down
2 changes: 2 additions & 0 deletions doc/container-configuration.md
Expand Up @@ -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).
Expand Down
6 changes: 3 additions & 3 deletions doc/getting-started.md
Expand Up @@ -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();
Expand Down
27 changes: 21 additions & 6 deletions src/DI/Container.php
Expand Up @@ -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;
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -331,4 +336,14 @@ private function getInvoker()

return $this->invoker;
}

/**
* @return DefinitionSource
*/
private function createDefaultDefinitionSource()
{
$source = new SourceChain([new Autowiring]);
$source->setMutableDefinitionSource(new DefinitionArray);
return $source;
}
}
4 changes: 1 addition & 3 deletions src/DI/ContainerBuilder.php
Expand Up @@ -91,9 +91,7 @@ class ContainerBuilder
*/
public static function buildDevContainer()
{
$builder = new self();

return $builder->build();
return new Container;
}

/**
Expand Down
2 changes: 1 addition & 1 deletion src/DI/Proxy/ProxyFactory.php
Expand Up @@ -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;
Expand Down
9 changes: 9 additions & 0 deletions tests/UnitTest/ContainerBuilderTest.php
Expand Up @@ -2,6 +2,7 @@

namespace DI\Test\UnitTest;

use DI\Container;
use DI\ContainerBuilder;
use DI\Definition\Source\CachedDefinitionSource;
use DI\Definition\Source\DefinitionArray;
Expand Down Expand Up @@ -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());
}
}
8 changes: 8 additions & 0 deletions tests/UnitTest/ContainerTest.php
Expand Up @@ -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
}
}

0 comments on commit 572e03a

Please sign in to comment.