Skip to content

Commit

Permalink
Merge bd11b1a into a051a71
Browse files Browse the repository at this point in the history
  • Loading branch information
mnapoli committed May 14, 2016
2 parents a051a71 + bd11b1a commit f6508f9
Show file tree
Hide file tree
Showing 16 changed files with 294 additions and 324 deletions.
13 changes: 12 additions & 1 deletion src/DI/Definition/AliasDefinition.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,14 @@
namespace DI\Definition;

use DI\Scope;
use Interop\Container\ContainerInterface;

/**
* Defines an alias from an entry to another.
*
* @author Matthieu Napoli <matthieu@mnapoli.fr>
*/
class AliasDefinition implements CacheableDefinition
class AliasDefinition implements CacheableDefinition, SelfResolvingDefinition
{
/**
* Entry name.
Expand Down Expand Up @@ -56,4 +57,14 @@ public function getTargetEntryName()
{
return $this->targetEntryName;
}

public function resolve(ContainerInterface $container)
{
return $container->get($this->getTargetEntryName());
}

public function isResolvable(ContainerInterface $container)
{
return $container->has($this->getTargetEntryName());
}
}
56 changes: 0 additions & 56 deletions src/DI/Definition/Resolver/AliasResolver.php

This file was deleted.

28 changes: 7 additions & 21 deletions src/DI/Definition/Resolver/ResolverDispatcher.php
Original file line number Diff line number Diff line change
Expand Up @@ -27,15 +27,13 @@ class ResolverDispatcher implements DefinitionResolver
*/
private $proxyFactory;

private $valueResolver;
private $selfResolvingResolver;
private $arrayResolver;
private $factoryResolver;
private $decoratorResolver;
private $aliasResolver;
private $objectResolver;
private $instanceResolver;
private $envVariableResolver;
private $stringResolver;

public function __construct(ContainerInterface $container, ProxyFactory $proxyFactory)
{
Expand Down Expand Up @@ -86,24 +84,18 @@ public function isResolvable(Definition $definition, array $parameters = [])
private function getDefinitionResolver(Definition $definition)
{
switch (true) {
case $definition instanceof \DI\Definition\SelfResolvingDefinition:
if (! $this->selfResolvingResolver) {
$this->selfResolvingResolver = new SelfResolver($this->container);
}

return $this->selfResolvingResolver;
case $definition instanceof \DI\Definition\ObjectDefinition:
if (! $this->objectResolver) {
$this->objectResolver = new ObjectCreator($this, $this->proxyFactory);
}

return $this->objectResolver;
case $definition instanceof \DI\Definition\ValueDefinition:
if (! $this->valueResolver) {
$this->valueResolver = new ValueResolver();
}

return $this->valueResolver;
case $definition instanceof \DI\Definition\AliasDefinition:
if (! $this->aliasResolver) {
$this->aliasResolver = new AliasResolver($this->container);
}

return $this->aliasResolver;
case $definition instanceof \DI\Definition\DecoratorDefinition:
if (! $this->decoratorResolver) {
$this->decoratorResolver = new DecoratorResolver($this->container, $this);
Expand All @@ -128,12 +120,6 @@ private function getDefinitionResolver(Definition $definition)
}

return $this->envVariableResolver;
case $definition instanceof \DI\Definition\StringDefinition:
if (! $this->stringResolver) {
$this->stringResolver = new StringResolver($this->container);
}

return $this->stringResolver;
case $definition instanceof \DI\Definition\InstanceDefinition:
if (! $this->instanceResolver) {
$this->instanceResolver = new InstanceInjector($this, $this->proxyFactory);
Expand Down
46 changes: 46 additions & 0 deletions src/DI/Definition/Resolver/SelfResolver.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
<?php

namespace DI\Definition\Resolver;

use DI\Definition\Definition;
use DI\Definition\SelfResolvingDefinition;
use Interop\Container\ContainerInterface;

/**
* Resolves self-resolving definitions.
*
* @since 5.3
* @author Matthieu Napoli <matthieu@mnapoli.fr>
*/
class SelfResolver implements DefinitionResolver
{
/**
* @var ContainerInterface
*/
private $container;

public function __construct(ContainerInterface $container)
{
$this->container = $container;
}

/**
* @param SelfResolvingDefinition $definition
*
* {@inheritdoc}
*/
public function resolve(Definition $definition, array $parameters = [])
{
return $definition->resolve($this->container);
}

/**
* @param SelfResolvingDefinition $definition
*
* {@inheritdoc}
*/
public function isResolvable(Definition $definition, array $parameters = [])
{
return $definition->isResolvable($this->container);
}
}
74 changes: 0 additions & 74 deletions src/DI/Definition/Resolver/StringResolver.php

This file was deleted.

37 changes: 0 additions & 37 deletions src/DI/Definition/Resolver/ValueResolver.php

This file was deleted.

27 changes: 27 additions & 0 deletions src/DI/Definition/SelfResolvingDefinition.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
<?php

namespace DI\Definition;

use Interop\Container\ContainerInterface;

/**
* Describes a definition that can resolve itself.
*
* @author Matthieu Napoli <matthieu@mnapoli.fr>
*/
interface SelfResolvingDefinition
{
/**
* Resolve the definition and return the resulting value.
*
* @return mixed
*/
public function resolve(ContainerInterface $container);

/**
* Check if a definition can be resolved.
*
* @return bool
*/
public function isResolvable(ContainerInterface $container);
}
33 changes: 32 additions & 1 deletion src/DI/Definition/StringDefinition.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,18 @@

namespace DI\Definition;

use DI\DependencyException;
use DI\Scope;
use Interop\Container\ContainerInterface;
use Interop\Container\Exception\NotFoundException;

/**
* Definition of a string composed of other strings.
*
* @since 5.0
* @author Matthieu Napoli <matthieu@mnapoli.fr>
*/
class StringDefinition implements Definition
class StringDefinition implements Definition, SelfResolvingDefinition
{
/**
* Entry name.
Expand Down Expand Up @@ -56,4 +59,32 @@ public function getExpression()
{
return $this->expression;
}

public function resolve(ContainerInterface $container)
{
$expression = $this->expression;

$result = preg_replace_callback('#\{([^\{\}]+)\}#', function (array $matches) use ($container) {
try {
return $container->get($matches[1]);
} catch (NotFoundException $e) {
throw new DependencyException(sprintf(
"Error while parsing string expression for entry '%s': %s",
$this->getName(),
$e->getMessage()
), 0, $e);
}
}, $expression);

if ($result === null) {
throw new \RuntimeException(sprintf('An unknown error occurred while parsing the string definition: \'%s\'', $expression));
}

return $result;
}

public function isResolvable(ContainerInterface $container)
{
return true;
}
}

0 comments on commit f6508f9

Please sign in to comment.