Skip to content

Commit 29d322a

Browse files
committed
Added custom dependency injection handler in Kernel
1 parent a9fb8d5 commit 29d322a

File tree

3 files changed

+89
-33
lines changed

3 files changed

+89
-33
lines changed

src/CodeTransformerKernel.php

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
namespace Okapi\CodeTransformer;
44

5+
use Closure;
56
use DI\Attribute\Inject;
67
use Okapi\CodeTransformer\Core\AutoloadInterceptor;
78
use Okapi\CodeTransformer\Core\Cache\CacheStateManager;
@@ -160,7 +161,7 @@ public static function init(): void
160161
}
161162

162163
/**
163-
* Register the dependency injection.
164+
* Internal dependency injection.
164165
*
165166
* @return void
166167
*/
@@ -199,22 +200,31 @@ protected function configureOptions(): void
199200
}
200201

201202
/**
202-
* Register the services.
203+
* Custom dependency injection handler.
203204
*
204-
* @return void
205+
* Pass a closure that takes a transformer class name as the argument and
206+
* returns a transformer instance.
207+
*
208+
* @return null|Closure(class-string<Transformer>): Transformer
205209
*/
210+
protected function dependencyInjectionHandler(): ?Closure
211+
{
212+
// Override this method to configure the dependency injection handler
213+
214+
return null;
215+
}
216+
206217
protected function registerServices(): void
207218
{
208-
// Options provider
209219
$this->options->register();
210220

211-
// Manage the user-defined transformers
221+
$this->transformerManager->registerCustomDependencyInjectionHandler(
222+
$this->dependencyInjectionHandler()
223+
);
212224
$this->transformerManager->register();
213225

214-
// Cache path manager
215226
$this->cacheStateManager->register();
216227

217-
// Stream filter -> Source transformer
218228
$this->streamFilter->register();
219229
}
220230

src/Core/Container/TransformerManager.php

Lines changed: 57 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,12 @@
22
/** @noinspection PhpPropertyOnlyWrittenInspection */
33
namespace Okapi\CodeTransformer\Core\Container;
44

5+
use Closure;
56
use Error;
67
use Exception;
78
use Okapi\CodeTransformer\Core\DI;
89
use Okapi\CodeTransformer\Core\Exception\Transformer\InvalidTransformerClassException;
10+
use Okapi\CodeTransformer\Core\Exception\Transformer\InvalidTransformerClassNameException;
911
use Okapi\CodeTransformer\Core\Exception\Transformer\TransformerNotFoundException;
1012
use Okapi\CodeTransformer\Core\ServiceInterface;
1113
use Okapi\CodeTransformer\Transformer;
@@ -32,6 +34,11 @@ class TransformerManager implements ServiceInterface
3234
*/
3335
private array $transformerContainers = [];
3436

37+
/**
38+
* @var ?Closure(class-string<Transformer>): Transformer
39+
*/
40+
private ?Closure $dependencyInjectionHandler = null;
41+
3542
// region Pre-Initialization
3643

3744
/**
@@ -54,51 +61,75 @@ public function addTransformers(array $transformers): void
5461
// region Initialization
5562

5663
/**
57-
* Register the transformer container.
58-
*
59-
* @return void
64+
* @param null|(Closure(class-string<Transformer>): Transformer) $dependencyInjectionHandler
6065
*/
66+
public function registerCustomDependencyInjectionHandler(
67+
?Closure $dependencyInjectionHandler
68+
): void {
69+
$this->dependencyInjectionHandler = $dependencyInjectionHandler;
70+
}
71+
6172
public function register(): void
6273
{
6374
$this->loadTransformers();
6475
}
6576

77+
private function loadTransformers(): void
78+
{
79+
foreach ($this->transformers as $transformer) {
80+
$this->loadTransformer($transformer);
81+
}
82+
}
83+
6684
/**
67-
* Get the transformer instances.
68-
*
69-
* @return void
85+
* @param class-string<Transformer> $transformerClassName
7086
*
7187
* @noinspection PhpUnhandledExceptionInspection
7288
* @noinspection PhpDocMissingThrowsInspection
7389
*/
74-
private function loadTransformers(): void
90+
private function loadTransformer(mixed $transformerClassName): void
7591
{
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 {
78110
try {
79-
$transformerInstance = DI::make($transformer);
111+
$transformerInstance = DI::make($transformerClassName);
80112
} catch (Error|Exception) {
81-
throw new TransformerNotFoundException($transformer);
113+
throw new TransformerNotFoundException($transformerClassName);
82114
}
115+
}
83116

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+
}
90122

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+
]);
95127

96-
// Create a reflection of the transformer
97-
$transformerRefClass = new BaseReflectionClass($transformerInstance);
128+
// Create a reflection of the transformer
129+
$transformerRefClass = new BaseReflectionClass($transformerInstance);
98130

99-
$filePath = $transformerRefClass->getFileName();
100-
$this->transformerContainers[$filePath] = $transformerContainer;
101-
}
131+
$filePath = $transformerRefClass->getFileName();
132+
$this->transformerContainers[$filePath] = $transformerContainer;
102133
}
103134

104135
// endregion
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
<?php
2+
3+
namespace Okapi\CodeTransformer\Core\Exception\Transformer;
4+
5+
use Okapi\CodeTransformer\Core\Exception\TransformerException;
6+
7+
class InvalidTransformerClassNameException extends TransformerException
8+
{
9+
public function __construct()
10+
{
11+
parent::__construct(
12+
'Transformer class name in Kernel must be a string.',
13+
);
14+
}
15+
}

0 commit comments

Comments
 (0)