Skip to content

Commit f90af5f

Browse files
authored
Merge pull request #41 from veewee/allow-xsi-type-information-in-literal-use
Allow xsi:type information for use=literal polymorphism
2 parents ddb611e + c9e141b commit f90af5f

File tree

4 files changed

+18
-10
lines changed

4 files changed

+18
-10
lines changed

src/Encoder/Context.php

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ public function __construct(
1717
public readonly EncoderRegistry $registry,
1818
public readonly Namespaces $namespaces,
1919
public readonly BindingUse $bindingUse = BindingUse::LITERAL,
20+
public readonly bool $skipXsiTypeDetection = false,
2021
) {
2122
}
2223

@@ -28,6 +29,7 @@ public function withType(XsdType $type): self
2829
$this->registry,
2930
$this->namespaces,
3031
$this->bindingUse,
32+
$this->skipXsiTypeDetection,
3133
);
3234
}
3335

@@ -39,6 +41,19 @@ public function withBindingUse(BindingUse $bindingUse): self
3941
$this->registry,
4042
$this->namespaces,
4143
$bindingUse,
44+
$this->skipXsiTypeDetection,
45+
);
46+
}
47+
48+
public function withSkipXsiTypeDetection(bool $skipXsiTypeDetection): self
49+
{
50+
return new self(
51+
$this->type,
52+
$this->metadata,
53+
$this->registry,
54+
$this->namespaces,
55+
$this->bindingUse,
56+
$skipXsiTypeDetection,
4257
);
4358
}
4459
}

src/Encoder/EncoderDetector.php

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
namespace Soap\Encoding\Encoder;
55

66
use Soap\Engine\Metadata\Model\XsdType;
7-
use Soap\WsdlReader\Model\Definitions\BindingUse;
87
use stdClass;
98
use WeakMap;
109

@@ -61,7 +60,7 @@ private function enhanceEncoder(Context $context, XmlEncoder $encoder): XmlEncod
6160
$meta = $context->type->getMeta();
6261
$isSimple = $meta->isSimple()->unwrapOr(false);
6362

64-
if (!$isSimple && !$encoder instanceof Feature\DisregardXsiInformation && $context->bindingUse === BindingUse::ENCODED) {
63+
if (!$isSimple && !$encoder instanceof Feature\DisregardXsiInformation && !$context->skipXsiTypeDetection) {
6564
$encoder = new XsiTypeEncoder($encoder);
6665
}
6766

src/Encoder/SimpleType/EncoderDetector.php

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
use Soap\Encoding\Encoder\XmlEncoder;
1111
use Soap\Encoding\Encoder\XsiTypeEncoder;
1212
use Soap\Engine\Metadata\Model\XsdType;
13-
use Soap\WsdlReader\Model\Definitions\BindingUse;
1413
use function Psl\Iter\any;
1514

1615
final class EncoderDetector
@@ -56,7 +55,7 @@ private function enhanceEncoder(Context $context, XmlEncoder $encoder): XmlEncod
5655
$encoder = new ElementEncoder($encoder);
5756
}
5857

59-
if (!$encoder instanceof Feature\DisregardXsiInformation && $context->bindingUse === BindingUse::ENCODED) {
58+
if (!$encoder instanceof Feature\DisregardXsiInformation && !$context->skipXsiTypeDetection) {
6059
$encoder = new XsiTypeEncoder($encoder);
6160
}
6261

src/TypeInference/XsiTypeDetector.php

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
use Soap\Encoding\Encoder\Context;
99
use Soap\Encoding\Encoder\FixedIsoEncoder;
1010
use Soap\Engine\Metadata\Model\XsdType;
11-
use Soap\WsdlReader\Model\Definitions\BindingUse;
1211
use Soap\WsdlReader\Parser\Xml\QnameParser;
1312
use Soap\Xml\Xmlns as SoapXmlns;
1413
use VeeWee\Xml\Xmlns\Xmlns;
@@ -47,10 +46,6 @@ static function () use ($context, $value) {
4746
*/
4847
public static function detectXsdTypeFromXmlElement(Context $context, DOMElement $element): Option
4948
{
50-
if ($context->bindingUse !== BindingUse::ENCODED) {
51-
return none();
52-
}
53-
5449
$xsiType = $element->getAttributeNS(Xmlns::xsi()->value(), 'type');
5550
if (!$xsiType) {
5651
return none();
@@ -98,7 +93,7 @@ public static function detectEncoderFromXmlElement(Context $context, DOMElement
9893
->withIsRepeatingElement(false);
9994
$encoderDetectorContext = $context
10095
->withType($type->withMeta(static fn () => $encoderDetectorTypeMeta))
101-
->withBindingUse(BindingUse::LITERAL);
96+
->withSkipXsiTypeDetection(true);
10297

10398
return some(
10499
new FixedIsoEncoder(

0 commit comments

Comments
 (0)