Skip to content

Commit

Permalink
Remove DependencyResolverInterface (#11)
Browse files Browse the repository at this point in the history
  • Loading branch information
yiiliveext committed Sep 18, 2021
1 parent 91e90a5 commit 0ab9295
Show file tree
Hide file tree
Showing 24 changed files with 121 additions and 186 deletions.
15 changes: 12 additions & 3 deletions src/ArrayDefinition.php
Expand Up @@ -4,8 +4,8 @@

namespace Yiisoft\Definitions;

use Psr\Container\ContainerInterface;
use Yiisoft\Definitions\Contract\DefinitionInterface;
use Yiisoft\Definitions\Contract\DependencyResolverInterface;
use Yiisoft\Definitions\Exception\InvalidConfigException;
use Yiisoft\Definitions\Exception\NotFoundException;
use Yiisoft\Definitions\Exception\NotInstantiableException;
Expand All @@ -32,6 +32,10 @@ final class ArrayDefinition implements DefinitionInterface
*/
private string $class;
private array $constructorArguments;
/**
* Container used to resolve references.
*/
private ?ContainerInterface $referenceContainer = null;

/**
* @psalm-var array<string, MethodOrPropertyItem>
Expand All @@ -49,6 +53,11 @@ private function __construct(string $class, array $constructorArguments, array $
$this->methodsAndProperties = $methodsAndProperties;
}

public function setReferenceContainer(?ContainerInterface $referenceContainer): void
{
$this->referenceContainer = $referenceContainer;
}

/**
* @psalm-param ArrayDefinitionConfig $config
*/
Expand Down Expand Up @@ -121,9 +130,9 @@ public function getMethodsAndProperties(): array
* @throws NotInstantiableException
* @throws InvalidConfigException
*/
public function resolve(DependencyResolverInterface $dependencyResolver): object
public function resolve(ContainerInterface $container): object
{
return ArrayDefinitionBuilder::getInstance()->build($dependencyResolver, $this);
return ArrayDefinitionBuilder::getInstance()->build($container, $this->referenceContainer, $this);
}

public function merge(self $other): self
Expand Down
12 changes: 6 additions & 6 deletions src/CallableDefinition.php
Expand Up @@ -5,11 +5,11 @@
namespace Yiisoft\Definitions;

use Closure;
use Psr\Container\ContainerInterface;
use ReflectionException;
use ReflectionFunction;
use ReflectionMethod;
use Yiisoft\Definitions\Contract\DefinitionInterface;
use Yiisoft\Definitions\Contract\DependencyResolverInterface;
use Yiisoft\Definitions\Exception\NotInstantiableException;
use Yiisoft\Definitions\Infrastructure\DefinitionExtractor;
use Yiisoft\Definitions\Infrastructure\DefinitionResolver;
Expand All @@ -35,11 +35,11 @@ public function __construct($callable)
$this->callable = $callable;
}

public function resolve(DependencyResolverInterface $dependencyResolver)
public function resolve(ContainerInterface $container)
{
try {
$reflection = new ReflectionFunction(
$this->prepareClosure($this->callable, $dependencyResolver)
$this->prepareClosure($this->callable, $container)
);
} catch (ReflectionException $e) {
throw new NotInstantiableException(
Expand All @@ -48,7 +48,7 @@ public function resolve(DependencyResolverInterface $dependencyResolver)
}

$dependencies = DefinitionExtractor::getInstance()->fromFunction($reflection);
$arguments = DefinitionResolver::resolveArray($dependencyResolver, $dependencies);
$arguments = DefinitionResolver::resolveArray($container, null, $dependencies);

return $reflection->invokeArgs($arguments);
}
Expand All @@ -58,13 +58,13 @@ public function resolve(DependencyResolverInterface $dependencyResolver)
*
* @psalm-param callable|array{0:class-string,1:string} $callable
*/
private function prepareClosure($callable, DependencyResolverInterface $dependencyResolver): Closure
private function prepareClosure($callable, ContainerInterface $container): Closure
{
if (is_array($callable) && !is_object($callable[0])) {
$reflection = new ReflectionMethod($callable[0], $callable[1]);
if (!$reflection->isStatic()) {
/** @var mixed */
$callable[0] = $dependencyResolver->resolve($callable[0]);
$callable[0] = $container->get($callable[0]);
}
}

Expand Down
12 changes: 6 additions & 6 deletions src/ClassDefinition.php
Expand Up @@ -4,9 +4,9 @@

namespace Yiisoft\Definitions;

use Psr\Container\ContainerInterface;
use Throwable;
use Yiisoft\Definitions\Contract\DefinitionInterface;
use Yiisoft\Definitions\Contract\DependencyResolverInterface;
use Yiisoft\Definitions\Exception\InvalidConfigException;

use function get_class;
Expand Down Expand Up @@ -41,15 +41,15 @@ public function getType(): string
/**
* @throws InvalidConfigException
*/
public function resolve(DependencyResolverInterface $dependencyResolver)
public function resolve(ContainerInterface $container)
{
if ($this->isUnionType()) {
return $this->resolveUnionType($dependencyResolver);
return $this->resolveUnionType($container);
}

try {
/** @var mixed */
$result = $dependencyResolver->resolve($this->class);
$result = $container->get($this->class);
} catch (Throwable $t) {
if ($this->optional) {
return null;
Expand All @@ -71,14 +71,14 @@ public function resolve(DependencyResolverInterface $dependencyResolver)
*
* @return mixed
*/
private function resolveUnionType(DependencyResolverInterface $dependencyResolver)
private function resolveUnionType(ContainerInterface $container)
{
$types = explode('|', $this->class);

foreach ($types as $type) {
try {
/** @var mixed */
$result = $dependencyResolver->resolve($type);
$result = $container->get($type);
if (!$result instanceof $type) {
$actualType = $this->getValueType($result);
throw new InvalidConfigException(
Expand Down
3 changes: 2 additions & 1 deletion src/Contract/DefinitionInterface.php
Expand Up @@ -4,6 +4,7 @@

namespace Yiisoft\Definitions\Contract;

use Psr\Container\ContainerInterface;
use Yiisoft\Definitions\Exception\CircularReferenceException;
use Yiisoft\Definitions\Exception\InvalidConfigException;
use Yiisoft\Definitions\Exception\NotFoundException;
Expand All @@ -24,5 +25,5 @@ interface DefinitionInterface
*
* @return mixed|object
*/
public function resolve(DependencyResolverInterface $dependencyResolver);
public function resolve(ContainerInterface $container);
}
40 changes: 0 additions & 40 deletions src/Contract/DependencyResolverInterface.php

This file was deleted.

6 changes: 3 additions & 3 deletions src/DynamicReference.php
Expand Up @@ -4,8 +4,8 @@

namespace Yiisoft\Definitions;

use Psr\Container\ContainerInterface;
use Yiisoft\Definitions\Contract\DefinitionInterface;
use Yiisoft\Definitions\Contract\DependencyResolverInterface;
use Yiisoft\Definitions\Contract\ReferenceInterface;
use Yiisoft\Definitions\Exception\InvalidConfigException;
use Yiisoft\Definitions\Infrastructure\Normalizer;
Expand Down Expand Up @@ -58,8 +58,8 @@ public static function to($id): self
return new self($id);
}

public function resolve(DependencyResolverInterface $dependencyResolver)
public function resolve(ContainerInterface $container)
{
return $this->definition->resolve($dependencyResolver);
return $this->definition->resolve($container);
}
}
8 changes: 4 additions & 4 deletions src/Infrastructure/ArrayDefinitionBuilder.php
Expand Up @@ -4,9 +4,9 @@

namespace Yiisoft\Definitions\Infrastructure;

use Psr\Container\ContainerInterface;
use Yiisoft\Definitions\ArrayDefinition;
use Yiisoft\Definitions\Contract\DefinitionInterface;
use Yiisoft\Definitions\Contract\DependencyResolverInterface;
use Yiisoft\Definitions\Exception\InvalidConfigException;
use Yiisoft\Definitions\Exception\NotFoundException;
use Yiisoft\Definitions\Exception\NotInstantiableException;
Expand Down Expand Up @@ -46,15 +46,15 @@ public static function getInstance(): self
* @throws NotInstantiableException
* @throws InvalidConfigException
*/
public function build(DependencyResolverInterface $dependencyResolver, ArrayDefinition $definition): object
public function build(ContainerInterface $container, ?ContainerInterface $referenceContainer, ArrayDefinition $definition): object
{
$class = $definition->getClass();
$dependencies = $this->getDependencies($class);
$constructorArguments = $definition->getConstructorArguments();

$this->injectArguments($dependencies, $constructorArguments);

$resolved = DefinitionResolver::resolveArray($dependencyResolver, $dependencies);
$resolved = DefinitionResolver::resolveArray($container, $referenceContainer, $dependencies);

/** @psalm-suppress MixedMethodCall */
$object = new $class(...array_values($resolved));
Expand All @@ -64,7 +64,7 @@ public function build(DependencyResolverInterface $dependencyResolver, ArrayDefi
/** @var mixed $value */
[$type, $name, $value] = $item;
/** @var mixed */
$value = DefinitionResolver::resolve($dependencyResolver, $value);
$value = DefinitionResolver::resolve($container, $referenceContainer, $value);
if ($type === ArrayDefinition::TYPE_METHOD) {
/** @var mixed */
$setter = call_user_func_array([$object, $name], $value);
Expand Down
13 changes: 7 additions & 6 deletions src/Infrastructure/DefinitionResolver.php
Expand Up @@ -4,8 +4,8 @@

namespace Yiisoft\Definitions\Infrastructure;

use Psr\Container\ContainerInterface;
use Yiisoft\Definitions\Contract\DefinitionInterface;
use Yiisoft\Definitions\Contract\DependencyResolverInterface;
use Yiisoft\Definitions\Contract\ReferenceInterface;
use Yiisoft\Definitions\Exception\InvalidConfigException;
use Yiisoft\Definitions\ParameterDefinition;
Expand All @@ -29,7 +29,7 @@ final class DefinitionResolver
*
* @psalm-return array<string,mixed>
*/
public static function resolveArray(DependencyResolverInterface $dependencyResolver, array $dependencies): array
public static function resolveArray(ContainerInterface $container, ?ContainerInterface $referenceContainer, array $dependencies): array
{
$result = [];
/** @var mixed $definition */
Expand All @@ -45,7 +45,7 @@ public static function resolveArray(DependencyResolverInterface $dependencyResol
}

/** @var mixed */
$result[$key] = self::resolve($dependencyResolver, $definition);
$result[$key] = self::resolve($container, $referenceContainer, $definition);
}

return $result;
Expand All @@ -58,14 +58,15 @@ public static function resolveArray(DependencyResolverInterface $dependencyResol
*
* @return mixed
*/
public static function resolve(DependencyResolverInterface $dependencyResolver, $definition)
public static function resolve(ContainerInterface $container, ?ContainerInterface $referenceContainer, $definition)
{
if ($definition instanceof DefinitionInterface) {
$container = $referenceContainer !== null && $definition instanceof ReferenceInterface ? $referenceContainer : $container;
/** @var mixed $definition */
$definition = $definition->resolve($dependencyResolver);
$definition = $definition->resolve($container);
} elseif (is_array($definition)) {
/** @psalm-var array<string,mixed> $definition */
return self::resolveArray($dependencyResolver, $definition);
return self::resolveArray($container, $referenceContainer, $definition);
}

return $definition;
Expand Down
4 changes: 2 additions & 2 deletions src/ParameterDefinition.php
Expand Up @@ -4,11 +4,11 @@

namespace Yiisoft\Definitions;

use Psr\Container\ContainerInterface;
use ReflectionNamedType;
use ReflectionParameter;
use ReflectionUnionType;
use Yiisoft\Definitions\Contract\DefinitionInterface;
use Yiisoft\Definitions\Contract\DependencyResolverInterface;
use Yiisoft\Definitions\Exception\NotInstantiableException;

final class ParameterDefinition implements DefinitionInterface
Expand All @@ -35,7 +35,7 @@ public function hasValue(): bool
return $this->parameter->isDefaultValueAvailable() || $this->parameter->allowsNull();
}

public function resolve(DependencyResolverInterface $dependencyResolver)
public function resolve(ContainerInterface $container)
{
if ($this->parameter->isDefaultValueAvailable()) {
return $this->parameter->getDefaultValue();
Expand Down
6 changes: 3 additions & 3 deletions src/Reference.php
Expand Up @@ -4,7 +4,7 @@

namespace Yiisoft\Definitions;

use Yiisoft\Definitions\Contract\DependencyResolverInterface;
use Psr\Container\ContainerInterface;
use Yiisoft\Definitions\Contract\ReferenceInterface;
use Yiisoft\Definitions\Exception\InvalidConfigException;

Expand Down Expand Up @@ -47,8 +47,8 @@ public static function to($id): self
return new self($id);
}

public function resolve(DependencyResolverInterface $dependencyResolver)
public function resolve(ContainerInterface $container)
{
return $dependencyResolver->resolveReference($this->id);
return $container->get($this->id);
}
}
4 changes: 2 additions & 2 deletions src/ValueDefinition.php
Expand Up @@ -4,8 +4,8 @@

namespace Yiisoft\Definitions;

use Psr\Container\ContainerInterface;
use Yiisoft\Definitions\Contract\DefinitionInterface;
use Yiisoft\Definitions\Contract\DependencyResolverInterface;

final class ValueDefinition implements DefinitionInterface
{
Expand All @@ -30,7 +30,7 @@ public function getType(): ?string
return $this->type;
}

public function resolve(DependencyResolverInterface $dependencyResolver)
public function resolve(ContainerInterface $container)
{
return $this->value;
}
Expand Down

0 comments on commit 0ab9295

Please sign in to comment.