PluginProbe
Defender Security – Malware Scanner, Login Security & Firewall / 6.2.3
Defender Security – Malware Scanner, Login Security & Firewall v6.2.3
6.3.0 6.2.3 6.2.4 6.2.0 6.2.1 6.2.2 6.1.0 5.3.1 5.4.0 5.4.1 5.5.0 5.5.1 5.6.0 5.6.1 5.6.2 5.7.0 5.7.1 5.7.2 5.8.0 5.8.1 5.9.0 6.0.0 6.0.1 3.0.1 3.1.0 All 141 releases
defender-security / src / component / container / class-parameter-resolver.php

class-parameter-resolver.php in Defender Security – Malware Scanner, Login Security & Firewall 6.2.3, at src/component/container/class-parameter-resolver.php

108 lines 2.6 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * Dependency injection container parameter resolver.
4 *
5 * @package WP_Defender\Component\Container
6 */
7
8 namespace WP_Defender\Component\Container;
9
10 use RuntimeException;
11 use ReflectionParameter;
12 use ReflectionUnionType;
13 use ReflectionNamedType;
14 use WP_Defender\Component\Container;
15
16 /**
17 * Resolves constructor parameters through the container.
18 *
19 * @internal
20 */
21 final class Parameter_Resolver {
22
23 /**
24 * Dependency injection container.
25 *
26 * @var Container
27 */
28 private Container $container;
29
30 /**
31 * Initialize the parameter resolver.
32 *
33 * @param Container $container Dependency injection container.
34 */
35 public function __construct( Container $container ) {
36 $this->container = $container;
37 }
38
39 /**
40 * Resolve one constructor parameter.
41 *
42 * @param ReflectionParameter $parameter Constructor parameter.
43 * @param array<string, mixed> $parameters Named constructor parameters.
44 *
45 * @throws RuntimeException Parameter cannot be resolved.
46 */
47 public function resolve( ReflectionParameter $parameter, array $parameters ): mixed {
48 $name = $parameter->getName();
49 if ( array_key_exists( $name, $parameters ) ) {
50 return $parameters[ $name ];
51 }
52
53 $type = $parameter->getType();
54 $dependency = $this->resolve_dependency( $type );
55 if ( null !== $dependency ) {
56 return $dependency;
57 }
58
59 if ( $parameter->isDefaultValueAvailable() ) {
60 return $parameter->getDefaultValue();
61 }
62
63 if ( null !== $type && $parameter->allowsNull() ) {
64 return null;
65 }
66
67 $declaring_class = $parameter->getDeclaringClass();
68 $class_name = $declaring_class ? $declaring_class->getName() : 'unknown';
69
70 throw new RuntimeException( esc_html( sprintf( 'Unable to resolve parameter "$%s" for class "%s".', $name, $class_name ) ) );
71 }
72
73 /**
74 * Resolve a dependency from a reflected parameter type.
75 *
76 * @param mixed $type Reflected parameter type.
77 */
78 private function resolve_dependency( mixed $type ): mixed {
79 if ( $type instanceof ReflectionNamedType ) {
80 return $this->resolve_named_type( $type );
81 }
82
83 if ( $type instanceof ReflectionUnionType ) {
84 foreach ( $type->getTypes() as $named_type ) {
85 $dependency = $this->resolve_named_type( $named_type );
86 if ( null !== $dependency ) {
87 return $dependency;
88 }
89 }
90 }
91
92 return null;
93 }
94
95 /**
96 * Resolve a named, non-built-in dependency type.
97 *
98 * @param ReflectionNamedType $type Reflected parameter type.
99 */
100 private function resolve_named_type( ReflectionNamedType $type ): mixed {
101 if ( $type->isBuiltin() || ! $this->container->has( $type->getName() ) ) {
102 return null;
103 }
104
105 return $this->container->get( $type->getName() );
106 }
107 }
108