PluginProbe
Cookiebot by Usercentrics – Automatic Cookie Banner for GDPR/CCPA & Google Consent Mode / 3.10.1
Cookiebot by Usercentrics – Automatic Cookie Banner for GDPR/CCPA & Google Consent Mode v3.10.1
4.7.4 4.7.5 4.7.3 4.7.2 4.7.1 trunk 2.3.0 2.4.0 2.4.1 2.4.2 2.5.0 3.0.0 3.0.1 3.1.0 3.10.0 3.10.1 3.11.1 3.11.2 3.11.3 3.2.0 3.3.0 3.3.1 3.4.0 3.4.1 3.4.2 All 95 releases
cookiebot / addons / lib / ioc / php-di / invoker / src / Invoker.php

Invoker.php in Cookiebot by Usercentrics – Automatic Cookie Banner for GDPR/CCPA & Google Consent Mode 3.10.1, at addons/lib/ioc/php-di/invoker/src/Invoker.php

123 lines 3.3 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 namespace Invoker;
4
5 use Interop\Container\ContainerInterface;
6 use Invoker\Exception\NotCallableException;
7 use Invoker\Exception\NotEnoughParametersException;
8 use Invoker\ParameterResolver\AssociativeArrayResolver;
9 use Invoker\ParameterResolver\DefaultValueResolver;
10 use Invoker\ParameterResolver\NumericArrayResolver;
11 use Invoker\ParameterResolver\ParameterResolver;
12 use Invoker\ParameterResolver\ResolverChain;
13 use Invoker\Reflection\CallableReflection;
14
15 /**
16 * Invoke a callable.
17 *
18 * @author Matthieu Napoli <[email protected]>
19 */
20 class Invoker implements InvokerInterface
21 {
22 /**
23 * @var CallableResolver|null
24 */
25 private $callableResolver;
26
27 /**
28 * @var ParameterResolver
29 */
30 private $parameterResolver;
31
32 /**
33 * @var ContainerInterface|null
34 */
35 private $container;
36
37 public function __construct(ParameterResolver $parameterResolver = null, ContainerInterface $container = null)
38 {
39 $this->parameterResolver = $parameterResolver ?: $this->createParameterResolver();
40 $this->container = $container;
41
42 if ($container) {
43 $this->callableResolver = new CallableResolver($container);
44 }
45 }
46
47 /**
48 * {@inheritdoc}
49 */
50 public function call($callable, array $parameters = array())
51 {
52 if ($this->callableResolver) {
53 $callable = $this->callableResolver->resolve($callable);
54 }
55
56 if (! is_callable($callable)) {
57 throw new NotCallableException(sprintf(
58 '%s is not a callable',
59 is_object($callable) ? 'Instance of ' . get_class($callable) : var_export($callable, true)
60 ));
61 }
62
63 $callableReflection = CallableReflection::create($callable);
64
65 $args = $this->parameterResolver->getParameters($callableReflection, $parameters, array());
66
67 // Sort by array key because call_user_func_array ignores numeric keys
68 ksort($args);
69
70 // Check all parameters are resolved
71 $diff = array_diff_key($callableReflection->getParameters(), $args);
72 if (! empty($diff)) {
73 /** @var \ReflectionParameter $parameter */
74 $parameter = reset($diff);
75 throw new NotEnoughParametersException(sprintf(
76 'Unable to invoke the callable because no value was given for parameter %d ($%s)',
77 $parameter->getPosition() + 1,
78 $parameter->name
79 ));
80 }
81
82 return call_user_func_array($callable, $args);
83 }
84
85 /**
86 * Create the default parameter resolver.
87 *
88 * @return ParameterResolver
89 */
90 private function createParameterResolver()
91 {
92 return new ResolverChain(array(
93 new NumericArrayResolver,
94 new AssociativeArrayResolver,
95 new DefaultValueResolver,
96 ));
97 }
98
99 /**
100 * @return ParameterResolver By default it's a ResolverChain
101 */
102 public function getParameterResolver()
103 {
104 return $this->parameterResolver;
105 }
106
107 /**
108 * @return ContainerInterface|null
109 */
110 public function getContainer()
111 {
112 return $this->container;
113 }
114
115 /**
116 * @return CallableResolver|null Returns null if no container was given in the constructor.
117 */
118 public function getCallableResolver()
119 {
120 return $this->callableResolver;
121 }
122 }
123