@@ -49,10 +49,10 @@ final class BuilderEncoder implements Encoder
49
49
OperatorInterface::class => OperatorEncoder::class,
50
50
];
51
51
52
- /** @var array<class-string, ExpressionEncoder |null> */
52
+ /** @var array<class-string, Encoder |null> */
53
53
private array $ cachedEncoders = [];
54
54
55
- /** @param array<class-string, class-string<ExpressionEncoder> > $customEncoders */
55
+ /** @param array<class-string, Encoder > $customEncoders */
56
56
public function __construct (private readonly array $ customEncoders = [])
57
57
{
58
58
}
@@ -78,7 +78,7 @@ public function encode(mixed $value): stdClass|array|string|int
78
78
return $ encoder ->encode ($ value );
79
79
}
80
80
81
- private function getEncoderFor (object $ value ): ExpressionEncoder |null
81
+ private function getEncoderFor (object $ value ): Encoder |null
82
82
{
83
83
$ valueClass = $ value ::class;
84
84
if (array_key_exists ($ valueClass , $ this ->cachedEncoders )) {
@@ -89,13 +89,22 @@ private function getEncoderFor(object $value): ExpressionEncoder|null
89
89
90
90
// First attempt: match class name exactly
91
91
if (isset ($ encoderList [$ valueClass ])) {
92
- return $ this ->cachedEncoders [$ valueClass ] = new $ encoderList [$ valueClass ]($ this );
92
+ $ encoder = $ encoderList [$ valueClass ];
93
+ if (is_string ($ encoder )) {
94
+ $ encoder = new $ encoder ($ this );
95
+ }
96
+
97
+ return $ this ->cachedEncoders [$ valueClass ] = $ encoder ;
93
98
}
94
99
95
100
// Second attempt: catch child classes
96
- foreach ($ encoderList as $ className => $ encoderClass ) {
101
+ foreach ($ encoderList as $ className => $ encoder ) {
97
102
if ($ value instanceof $ className ) {
98
- return $ this ->cachedEncoders [$ valueClass ] = new $ encoderClass ($ this );
103
+ if (is_string ($ encoder )) {
104
+ $ encoder = new $ encoder ($ this );
105
+ }
106
+
107
+ return $ this ->cachedEncoders [$ valueClass ] = $ encoder ;
99
108
}
100
109
}
101
110
0 commit comments