first commit
This commit is contained in:
37
vendor/php-di/invoker/src/ParameterResolver/AssociativeArrayResolver.php
vendored
Normal file
37
vendor/php-di/invoker/src/ParameterResolver/AssociativeArrayResolver.php
vendored
Normal file
@@ -0,0 +1,37 @@
|
||||
<?php declare(strict_types=1);
|
||||
|
||||
namespace Invoker\ParameterResolver;
|
||||
|
||||
use ReflectionFunctionAbstract;
|
||||
|
||||
/**
|
||||
* Tries to map an associative array (string-indexed) to the parameter names.
|
||||
*
|
||||
* E.g. `->call($callable, ['foo' => 'bar'])` will inject the string `'bar'`
|
||||
* in the parameter named `$foo`.
|
||||
*
|
||||
* Parameters that are not indexed by a string are ignored.
|
||||
*/
|
||||
class AssociativeArrayResolver implements ParameterResolver
|
||||
{
|
||||
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) {
|
||||
if (array_key_exists($parameter->name, $providedParameters)) {
|
||||
$resolvedParameters[$index] = $providedParameters[$parameter->name];
|
||||
}
|
||||
}
|
||||
|
||||
return $resolvedParameters;
|
||||
}
|
||||
}
|
||||
47
vendor/php-di/invoker/src/ParameterResolver/Container/ParameterNameContainerResolver.php
vendored
Normal file
47
vendor/php-di/invoker/src/ParameterResolver/Container/ParameterNameContainerResolver.php
vendored
Normal file
@@ -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
vendor/php-di/invoker/src/ParameterResolver/Container/TypeHintContainerResolver.php
vendored
Normal file
65
vendor/php-di/invoker/src/ParameterResolver/Container/TypeHintContainerResolver.php
vendored
Normal file
@@ -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;
|
||||
}
|
||||
}
|
||||
43
vendor/php-di/invoker/src/ParameterResolver/DefaultValueResolver.php
vendored
Normal file
43
vendor/php-di/invoker/src/ParameterResolver/DefaultValueResolver.php
vendored
Normal file
@@ -0,0 +1,43 @@
|
||||
<?php declare(strict_types=1);
|
||||
|
||||
namespace Invoker\ParameterResolver;
|
||||
|
||||
use ReflectionException;
|
||||
use ReflectionFunctionAbstract;
|
||||
|
||||
/**
|
||||
* Finds the default value for a parameter, *if it exists*.
|
||||
*/
|
||||
class DefaultValueResolver implements ParameterResolver
|
||||
{
|
||||
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) {
|
||||
\assert($parameter instanceof \ReflectionParameter);
|
||||
if ($parameter->isDefaultValueAvailable()) {
|
||||
try {
|
||||
$resolvedParameters[$index] = $parameter->getDefaultValue();
|
||||
} catch (ReflectionException $e) {
|
||||
// Can't get default values from PHP internal classes and functions
|
||||
}
|
||||
} else {
|
||||
$parameterType = $parameter->getType();
|
||||
if ($parameterType && $parameterType->allowsNull()) {
|
||||
$resolvedParameters[$index] = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return $resolvedParameters;
|
||||
}
|
||||
}
|
||||
37
vendor/php-di/invoker/src/ParameterResolver/NumericArrayResolver.php
vendored
Normal file
37
vendor/php-di/invoker/src/ParameterResolver/NumericArrayResolver.php
vendored
Normal file
@@ -0,0 +1,37 @@
|
||||
<?php declare(strict_types=1);
|
||||
|
||||
namespace Invoker\ParameterResolver;
|
||||
|
||||
use ReflectionFunctionAbstract;
|
||||
|
||||
/**
|
||||
* Simply returns all the values of the $providedParameters array that are
|
||||
* indexed by the parameter position (i.e. a number).
|
||||
*
|
||||
* E.g. `->call($callable, ['foo', 'bar'])` will simply resolve the parameters
|
||||
* to `['foo', 'bar']`.
|
||||
*
|
||||
* Parameters that are not indexed by a number (i.e. parameter position)
|
||||
* will be ignored.
|
||||
*/
|
||||
class NumericArrayResolver implements ParameterResolver
|
||||
{
|
||||
public function getParameters(
|
||||
ReflectionFunctionAbstract $reflection,
|
||||
array $providedParameters,
|
||||
array $resolvedParameters
|
||||
): array {
|
||||
// Skip parameters already resolved
|
||||
if (! empty($resolvedParameters)) {
|
||||
$providedParameters = array_diff_key($providedParameters, $resolvedParameters);
|
||||
}
|
||||
|
||||
foreach ($providedParameters as $key => $value) {
|
||||
if (is_int($key)) {
|
||||
$resolvedParameters[$key] = $value;
|
||||
}
|
||||
}
|
||||
|
||||
return $resolvedParameters;
|
||||
}
|
||||
}
|
||||
30
vendor/php-di/invoker/src/ParameterResolver/ParameterResolver.php
vendored
Normal file
30
vendor/php-di/invoker/src/ParameterResolver/ParameterResolver.php
vendored
Normal file
@@ -0,0 +1,30 @@
|
||||
<?php declare(strict_types=1);
|
||||
|
||||
namespace Invoker\ParameterResolver;
|
||||
|
||||
use ReflectionFunctionAbstract;
|
||||
|
||||
/**
|
||||
* Resolves the parameters to use to call the callable.
|
||||
*/
|
||||
interface ParameterResolver
|
||||
{
|
||||
/**
|
||||
* Resolves the parameters to use to call the callable.
|
||||
*
|
||||
* `$resolvedParameters` contains parameters that have already been resolved.
|
||||
*
|
||||
* Each ParameterResolver must resolve parameters that are not already
|
||||
* in `$resolvedParameters`. That allows to chain multiple ParameterResolver.
|
||||
*
|
||||
* @param ReflectionFunctionAbstract $reflection Reflection object for the callable.
|
||||
* @param array $providedParameters Parameters provided by the caller.
|
||||
* @param array $resolvedParameters Parameters resolved (indexed by parameter position).
|
||||
* @return array
|
||||
*/
|
||||
public function getParameters(
|
||||
ReflectionFunctionAbstract $reflection,
|
||||
array $providedParameters,
|
||||
array $resolvedParameters
|
||||
);
|
||||
}
|
||||
61
vendor/php-di/invoker/src/ParameterResolver/ResolverChain.php
vendored
Normal file
61
vendor/php-di/invoker/src/ParameterResolver/ResolverChain.php
vendored
Normal file
@@ -0,0 +1,61 @@
|
||||
<?php declare(strict_types=1);
|
||||
|
||||
namespace Invoker\ParameterResolver;
|
||||
|
||||
use ReflectionFunctionAbstract;
|
||||
|
||||
/**
|
||||
* Dispatches the call to other resolvers until all parameters are resolved.
|
||||
*
|
||||
* Chain of responsibility pattern.
|
||||
*/
|
||||
class ResolverChain implements ParameterResolver
|
||||
{
|
||||
/** @var ParameterResolver[] */
|
||||
private $resolvers;
|
||||
|
||||
public function __construct(array $resolvers = [])
|
||||
{
|
||||
$this->resolvers = $resolvers;
|
||||
}
|
||||
|
||||
public function getParameters(
|
||||
ReflectionFunctionAbstract $reflection,
|
||||
array $providedParameters,
|
||||
array $resolvedParameters
|
||||
): array {
|
||||
$reflectionParameters = $reflection->getParameters();
|
||||
|
||||
foreach ($this->resolvers as $resolver) {
|
||||
$resolvedParameters = $resolver->getParameters(
|
||||
$reflection,
|
||||
$providedParameters,
|
||||
$resolvedParameters
|
||||
);
|
||||
|
||||
$diff = array_diff_key($reflectionParameters, $resolvedParameters);
|
||||
if (empty($diff)) {
|
||||
// Stop traversing: all parameters are resolved
|
||||
return $resolvedParameters;
|
||||
}
|
||||
}
|
||||
|
||||
return $resolvedParameters;
|
||||
}
|
||||
|
||||
/**
|
||||
* Push a parameter resolver after the ones already registered.
|
||||
*/
|
||||
public function appendResolver(ParameterResolver $resolver): void
|
||||
{
|
||||
$this->resolvers[] = $resolver;
|
||||
}
|
||||
|
||||
/**
|
||||
* Insert a parameter resolver before the ones already registered.
|
||||
*/
|
||||
public function prependResolver(ParameterResolver $resolver): void
|
||||
{
|
||||
array_unshift($this->resolvers, $resolver);
|
||||
}
|
||||
}
|
||||
54
vendor/php-di/invoker/src/ParameterResolver/TypeHintResolver.php
vendored
Normal file
54
vendor/php-di/invoker/src/ParameterResolver/TypeHintResolver.php
vendored
Normal file
@@ -0,0 +1,54 @@
|
||||
<?php declare(strict_types=1);
|
||||
|
||||
namespace Invoker\ParameterResolver;
|
||||
|
||||
use ReflectionFunctionAbstract;
|
||||
use ReflectionNamedType;
|
||||
|
||||
/**
|
||||
* Inject entries using type-hints.
|
||||
*
|
||||
* Tries to match type-hints with the parameters provided.
|
||||
*/
|
||||
class TypeHintResolver implements ParameterResolver
|
||||
{
|
||||
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 (array_key_exists($parameterClass, $providedParameters)) {
|
||||
$resolvedParameters[$index] = $providedParameters[$parameterClass];
|
||||
}
|
||||
}
|
||||
|
||||
return $resolvedParameters;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user