glastree_on_gitea
This commit is contained in:
+47
@@ -0,0 +1,47 @@
|
||||
<?php declare(strict_types=1);
|
||||
|
||||
namespace Invoker\ParameterResolver\Container;
|
||||
|
||||
use Invoker\ParameterResolver\ParameterResolver;
|
||||
use Psr\Container\ContainerInterface;
|
||||
use ReflectionFunctionAbstract;
|
||||
|
||||
/**
|
||||
* Inject entries from a DI container using the parameter names.
|
||||
*/
|
||||
class ParameterNameContainerResolver implements ParameterResolver
|
||||
{
|
||||
/** @var ContainerInterface */
|
||||
private $container;
|
||||
|
||||
/**
|
||||
* @param ContainerInterface $container The container to get entries from.
|
||||
*/
|
||||
public function __construct(ContainerInterface $container)
|
||||
{
|
||||
$this->container = $container;
|
||||
}
|
||||
|
||||
public function getParameters(
|
||||
ReflectionFunctionAbstract $reflection,
|
||||
array $providedParameters,
|
||||
array $resolvedParameters
|
||||
): array {
|
||||
$parameters = $reflection->getParameters();
|
||||
|
||||
// Skip parameters already resolved
|
||||
if (! empty($resolvedParameters)) {
|
||||
$parameters = array_diff_key($parameters, $resolvedParameters);
|
||||
}
|
||||
|
||||
foreach ($parameters as $index => $parameter) {
|
||||
$name = $parameter->name;
|
||||
|
||||
if ($name && $this->container->has($name)) {
|
||||
$resolvedParameters[$index] = $this->container->get($name);
|
||||
}
|
||||
}
|
||||
|
||||
return $resolvedParameters;
|
||||
}
|
||||
}
|
||||
+65
@@ -0,0 +1,65 @@
|
||||
<?php declare(strict_types=1);
|
||||
|
||||
namespace Invoker\ParameterResolver\Container;
|
||||
|
||||
use Invoker\ParameterResolver\ParameterResolver;
|
||||
use Psr\Container\ContainerInterface;
|
||||
use ReflectionFunctionAbstract;
|
||||
use ReflectionNamedType;
|
||||
|
||||
/**
|
||||
* Inject entries from a DI container using the type-hints.
|
||||
*/
|
||||
class TypeHintContainerResolver implements ParameterResolver
|
||||
{
|
||||
/** @var ContainerInterface */
|
||||
private $container;
|
||||
|
||||
/**
|
||||
* @param ContainerInterface $container The container to get entries from.
|
||||
*/
|
||||
public function __construct(ContainerInterface $container)
|
||||
{
|
||||
$this->container = $container;
|
||||
}
|
||||
|
||||
public function getParameters(
|
||||
ReflectionFunctionAbstract $reflection,
|
||||
array $providedParameters,
|
||||
array $resolvedParameters
|
||||
): array {
|
||||
$parameters = $reflection->getParameters();
|
||||
|
||||
// Skip parameters already resolved
|
||||
if (! empty($resolvedParameters)) {
|
||||
$parameters = array_diff_key($parameters, $resolvedParameters);
|
||||
}
|
||||
|
||||
foreach ($parameters as $index => $parameter) {
|
||||
$parameterType = $parameter->getType();
|
||||
if (! $parameterType) {
|
||||
// No type
|
||||
continue;
|
||||
}
|
||||
if (! $parameterType instanceof ReflectionNamedType) {
|
||||
// Union types are not supported
|
||||
continue;
|
||||
}
|
||||
if ($parameterType->isBuiltin()) {
|
||||
// Primitive types are not supported
|
||||
continue;
|
||||
}
|
||||
|
||||
$parameterClass = $parameterType->getName();
|
||||
if ($parameterClass === 'self') {
|
||||
$parameterClass = $parameter->getDeclaringClass()->getName();
|
||||
}
|
||||
|
||||
if ($this->container->has($parameterClass)) {
|
||||
$resolvedParameters[$index] = $this->container->get($parameterClass);
|
||||
}
|
||||
}
|
||||
|
||||
return $resolvedParameters;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user