2
2
/** @noinspection PhpPropertyOnlyWrittenInspection */
3
3
namespace Okapi \CodeTransformer \Core \Container ;
4
4
5
+ use Closure ;
5
6
use Error ;
6
7
use Exception ;
7
8
use Okapi \CodeTransformer \Core \DI ;
8
9
use Okapi \CodeTransformer \Core \Exception \Transformer \InvalidTransformerClassException ;
10
+ use Okapi \CodeTransformer \Core \Exception \Transformer \InvalidTransformerClassNameException ;
9
11
use Okapi \CodeTransformer \Core \Exception \Transformer \TransformerNotFoundException ;
10
12
use Okapi \CodeTransformer \Core \ServiceInterface ;
11
13
use Okapi \CodeTransformer \Transformer ;
@@ -32,6 +34,11 @@ class TransformerManager implements ServiceInterface
32
34
*/
33
35
private array $ transformerContainers = [];
34
36
37
+ /**
38
+ * @var ?Closure(class-string<Transformer>): Transformer
39
+ */
40
+ private ?Closure $ dependencyInjectionHandler = null ;
41
+
35
42
// region Pre-Initialization
36
43
37
44
/**
@@ -54,51 +61,73 @@ public function addTransformers(array $transformers): void
54
61
// region Initialization
55
62
56
63
/**
57
- * Register the transformer container.
58
- *
59
- * @return void
64
+ * @param null|(Closure(class-string<Transformer>): Transformer) $dependencyInjectionHandler
60
65
*/
66
+ public function registerCustomDependencyInjectionHandler (
67
+ ?Closure $ dependencyInjectionHandler
68
+ ): void {
69
+ $ this ->dependencyInjectionHandler = $ dependencyInjectionHandler ;
70
+ }
71
+
61
72
public function register (): void
62
73
{
63
74
$ this ->loadTransformers ();
64
75
}
65
76
77
+ private function loadTransformers (): void
78
+ {
79
+ foreach ($ this ->transformers as $ transformer ) {
80
+ $ this ->loadTransformer ($ transformer );
81
+ }
82
+ }
83
+
66
84
/**
67
- * Get the transformer instances.
68
- *
69
- * @return void
85
+ * @param class-string<Transformer> $transformerClassName
70
86
*
71
87
* @noinspection PhpUnhandledExceptionInspection
72
88
* @noinspection PhpDocMissingThrowsInspection
73
89
*/
74
- private function loadTransformers ( ): void
90
+ private function loadTransformer ( mixed $ transformerClassName ): void
75
91
{
76
- foreach ($ this ->transformers as $ transformer ) {
77
- // Instantiate the transformer
92
+ // Check if the transformer is already loaded
93
+ if (array_key_exists ($ transformerClassName , $ this ->transformerContainers )) {
94
+ // @codeCoverageIgnoreStart
95
+ return ;
96
+ // @codeCoverageIgnoreEnd
97
+ }
98
+
99
+ // Validate the transformer
100
+ if (gettype ($ transformerClassName ) !== 'string ' ) {
101
+ throw new InvalidTransformerClassNameException ;
102
+ }
103
+
104
+ // Instantiate the transformer
105
+ if ($ this ->dependencyInjectionHandler ) {
106
+ $ transformerInstance = ($ this ->dependencyInjectionHandler )($ transformerClassName );
107
+ } else {
78
108
try {
79
- $ transformerInstance = DI ::make ($ transformer );
109
+ $ transformerInstance = DI ::make ($ transformerClassName );
80
110
} catch (Error |Exception ) {
81
- throw new TransformerNotFoundException ($ transformer );
111
+ throw new TransformerNotFoundException ($ transformerClassName );
82
112
}
113
+ }
83
114
84
- // Validate the transformer
85
- $ isTransformer = $ transformerInstance instanceof Transformer;
86
- if (!$ isTransformer ) {
87
- throw new InvalidTransformerClassException ($ transformer );
88
- }
89
- assert ($ transformerInstance instanceof Transformer);
115
+ // Validate the transformer
116
+ $ isTransformer = $ transformerInstance instanceof Transformer;
117
+ if (!$ isTransformer ) {
118
+ throw new InvalidTransformerClassException ($ transformerClassName );
119
+ }
90
120
91
- // Create transformer container
92
- $ transformerContainer = DI ::make (TransformerContainer::class, [
93
- 'transformerInstance ' => $ transformerInstance ,
94
- ]);
121
+ // Create transformer container
122
+ $ transformerContainer = DI ::make (TransformerContainer::class, [
123
+ 'transformerInstance ' => $ transformerInstance ,
124
+ ]);
95
125
96
- // Create a reflection of the transformer
97
- $ transformerRefClass = new BaseReflectionClass ($ transformerInstance );
126
+ // Create a reflection of the transformer
127
+ $ transformerRefClass = new BaseReflectionClass ($ transformerInstance );
98
128
99
- $ filePath = $ transformerRefClass ->getFileName ();
100
- $ this ->transformerContainers [$ filePath ] = $ transformerContainer ;
101
- }
129
+ $ filePath = $ transformerRefClass ->getFileName ();
130
+ $ this ->transformerContainers [$ filePath ] = $ transformerContainer ;
102
131
}
103
132
104
133
// endregion
0 commit comments