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,75 @@ 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
+ return ;
95
+ }
96
+
97
+ // Validate the transformer
98
+ if (gettype ($ transformerClassName ) !== 'string ' ) {
99
+ throw new InvalidTransformerClassNameException ;
100
+ }
101
+
102
+ // Instantiate the transformer
103
+ if ($ this ->dependencyInjectionHandler ) {
104
+ $ transformerInstance = ($ this ->dependencyInjectionHandler )($ transformerClassName );
105
+
106
+ if (!($ transformerInstance instanceof Transformer)) {
107
+ throw new InvalidTransformerClassException ($ transformerClassName );
108
+ }
109
+ } else {
78
110
try {
79
- $ transformerInstance = DI ::make ($ transformer );
111
+ $ transformerInstance = DI ::make ($ transformerClassName );
80
112
} catch (Error |Exception ) {
81
- throw new TransformerNotFoundException ($ transformer );
113
+ throw new TransformerNotFoundException ($ transformerClassName );
82
114
}
115
+ }
83
116
84
- // Validate the transformer
85
- $ isTransformer = $ transformerInstance instanceof Transformer;
86
- if (!$ isTransformer ) {
87
- throw new InvalidTransformerClassException ($ transformer );
88
- }
89
- assert ($ transformerInstance instanceof Transformer);
117
+ // Validate the transformer
118
+ $ isTransformer = $ transformerInstance instanceof Transformer;
119
+ if (!$ isTransformer ) {
120
+ throw new InvalidTransformerClassException ($ transformerClassName );
121
+ }
90
122
91
- // Create transformer container
92
- $ transformerContainer = DI ::make (TransformerContainer::class, [
93
- 'transformerInstance ' => $ transformerInstance ,
94
- ]);
123
+ // Create transformer container
124
+ $ transformerContainer = DI ::make (TransformerContainer::class, [
125
+ 'transformerInstance ' => $ transformerInstance ,
126
+ ]);
95
127
96
- // Create a reflection of the transformer
97
- $ transformerRefClass = new BaseReflectionClass ($ transformerInstance );
128
+ // Create a reflection of the transformer
129
+ $ transformerRefClass = new BaseReflectionClass ($ transformerInstance );
98
130
99
- $ filePath = $ transformerRefClass ->getFileName ();
100
- $ this ->transformerContainers [$ filePath ] = $ transformerContainer ;
101
- }
131
+ $ filePath = $ transformerRefClass ->getFileName ();
132
+ $ this ->transformerContainers [$ filePath ] = $ transformerContainer ;
102
133
}
103
134
104
135
// endregion
0 commit comments