PluginProbe
Elementor Website Builder – more than just a page builder / 3.27.0-dev2
Elementor Website Builder – more than just a page builder v3.27.0-dev2
4.3.0-beta3 4.3.0-beta2 4.3.0-beta1 4.2.4 4.2.3 4.2.2 4.2.1 4.2.0 4.1.5 4.2.0-beta2 4.2.0-dev2 4.2.0-beta1 4.1.4 4.1.3 4.1.2 4.1.1 4.1.0 4.1.0-beta3 4.1.0-dev3 4.0.9 4.1.0-beta2 4.1.0-dev2 4.0.8 4.1.0-beta1 4.1.0-dev1 All 452 releases
elementor / vendor_prefixed / php-di / invoker / src / Invoker.php

Invoker.php in Elementor Website Builder – more than just a page builder 3.27.0-dev2, at vendor_prefixed/php-di/invoker/src/Invoker.php

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