9
9
use MongoDB \Builder \Encoder \CombinedFieldQueryEncoder ;
10
10
use MongoDB \Builder \Encoder \DateTimeEncoder ;
11
11
use MongoDB \Builder \Encoder \DictionaryEncoder ;
12
- use MongoDB \Builder \Encoder \ExpressionEncoder ;
13
12
use MongoDB \Builder \Encoder \FieldPathEncoder ;
14
13
use MongoDB \Builder \Encoder \OperatorEncoder ;
15
14
use MongoDB \Builder \Encoder \OutputWindowEncoder ;
33
32
34
33
use function array_key_exists ;
35
34
use function is_object ;
35
+ use function is_string ;
36
36
37
37
/** @template-implements Encoder<Type|stdClass|array|string|int, Pipeline|StageInterface|ExpressionInterface|QueryInterface> */
38
38
final class BuilderEncoder implements Encoder
39
39
{
40
40
/** @template-use EncodeIfSupported<Type|stdClass|array|string|int, Pipeline|StageInterface|ExpressionInterface|QueryInterface> */
41
41
use EncodeIfSupported;
42
42
43
- /** @var array<class-string, class-string<ExpressionEncoder >> */
43
+ /** @var array<class-string, class-string<Encoder >> */
44
44
private array $ defaultEncoders = [
45
45
Pipeline::class => PipelineEncoder::class,
46
46
Variable::class => VariableEncoder::class,
@@ -53,10 +53,10 @@ final class BuilderEncoder implements Encoder
53
53
DateTimeInterface::class => DateTimeEncoder::class,
54
54
];
55
55
56
- /** @var array<class-string, ExpressionEncoder |null> */
56
+ /** @var array<class-string, Encoder |null> */
57
57
private array $ cachedEncoders = [];
58
58
59
- /** @param array<class-string, class-string<ExpressionEncoder> > $customEncoders */
59
+ /** @param array<class-string, Encoder > $customEncoders */
60
60
public function __construct (private readonly array $ customEncoders = [])
61
61
{
62
62
}
@@ -82,7 +82,7 @@ public function encode(mixed $value): Type|stdClass|array|string|int
82
82
return $ encoder ->encode ($ value );
83
83
}
84
84
85
- private function getEncoderFor (object $ value ): ExpressionEncoder |null
85
+ private function getEncoderFor (object $ value ): Encoder |null
86
86
{
87
87
$ valueClass = $ value ::class;
88
88
if (array_key_exists ($ valueClass , $ this ->cachedEncoders )) {
@@ -93,13 +93,22 @@ private function getEncoderFor(object $value): ExpressionEncoder|null
93
93
94
94
// First attempt: match class name exactly
95
95
if (isset ($ encoderList [$ valueClass ])) {
96
- return $ this ->cachedEncoders [$ valueClass ] = new $ encoderList [$ valueClass ]($ this );
96
+ $ encoder = $ encoderList [$ valueClass ];
97
+ if (is_string ($ encoder )) {
98
+ $ encoder = new $ encoder ($ this );
99
+ }
100
+
101
+ return $ this ->cachedEncoders [$ valueClass ] = $ encoder ;
97
102
}
98
103
99
104
// Second attempt: catch child classes
100
- foreach ($ encoderList as $ className => $ encoderClass ) {
105
+ foreach ($ encoderList as $ className => $ encoder ) {
101
106
if ($ value instanceof $ className ) {
102
- return $ this ->cachedEncoders [$ valueClass ] = new $ encoderClass ($ this );
107
+ if (is_string ($ encoder )) {
108
+ $ encoder = new $ encoder ($ this );
109
+ }
110
+
111
+ return $ this ->cachedEncoders [$ valueClass ] = $ encoder ;
103
112
}
104
113
}
105
114
0 commit comments