99use MongoDB \Builder \Encoder \CombinedFieldQueryEncoder ;
1010use MongoDB \Builder \Encoder \DateTimeEncoder ;
1111use MongoDB \Builder \Encoder \DictionaryEncoder ;
12- use MongoDB \Builder \Encoder \ExpressionEncoder ;
1312use MongoDB \Builder \Encoder \FieldPathEncoder ;
1413use MongoDB \Builder \Encoder \OperatorEncoder ;
1514use MongoDB \Builder \Encoder \OutputWindowEncoder ;
3332
3433use function array_key_exists ;
3534use function is_object ;
35+ use function is_string ;
3636
3737/** @template-implements Encoder<Type|stdClass|array|string|int, Pipeline|StageInterface|ExpressionInterface|QueryInterface> */
3838final class BuilderEncoder implements Encoder
3939{
4040 /** @template-use EncodeIfSupported<Type|stdClass|array|string|int, Pipeline|StageInterface|ExpressionInterface|QueryInterface> */
4141 use EncodeIfSupported;
4242
43- /** @var array<class-string, class-string<ExpressionEncoder >> */
43+ /** @var array<class-string, class-string<Encoder >> */
4444 private array $ defaultEncoders = [
4545 Pipeline::class => PipelineEncoder::class,
4646 Variable::class => VariableEncoder::class,
@@ -53,10 +53,10 @@ final class BuilderEncoder implements Encoder
5353 DateTimeInterface::class => DateTimeEncoder::class,
5454 ];
5555
56- /** @var array<class-string, ExpressionEncoder |null> */
56+ /** @var array<class-string, Encoder |null> */
5757 private array $ cachedEncoders = [];
5858
59- /** @param array<class-string, class-string<ExpressionEncoder> > $customEncoders */
59+ /** @param array<class-string, Encoder > $customEncoders */
6060 public function __construct (private readonly array $ customEncoders = [])
6161 {
6262 }
@@ -82,7 +82,7 @@ public function encode(mixed $value): Type|stdClass|array|string|int
8282 return $ encoder ->encode ($ value );
8383 }
8484
85- private function getEncoderFor (object $ value ): ExpressionEncoder |null
85+ private function getEncoderFor (object $ value ): Encoder |null
8686 {
8787 $ valueClass = $ value ::class;
8888 if (array_key_exists ($ valueClass , $ this ->cachedEncoders )) {
@@ -93,13 +93,22 @@ private function getEncoderFor(object $value): ExpressionEncoder|null
9393
9494 // First attempt: match class name exactly
9595 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 ;
97102 }
98103
99104 // Second attempt: catch child classes
100- foreach ($ encoderList as $ className => $ encoderClass ) {
105+ foreach ($ encoderList as $ className => $ encoder ) {
101106 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 ;
103112 }
104113 }
105114
0 commit comments