diff --git a/src/Encoder/Context.php b/src/Encoder/Context.php index 16bad2b..56b2ea5 100644 --- a/src/Encoder/Context.php +++ b/src/Encoder/Context.php @@ -17,6 +17,7 @@ public function __construct( public readonly EncoderRegistry $registry, public readonly Namespaces $namespaces, public readonly BindingUse $bindingUse = BindingUse::LITERAL, + public readonly bool $skipXsiTypeDetection = false, ) { } @@ -28,6 +29,7 @@ public function withType(XsdType $type): self $this->registry, $this->namespaces, $this->bindingUse, + $this->skipXsiTypeDetection, ); } @@ -39,6 +41,19 @@ public function withBindingUse(BindingUse $bindingUse): self $this->registry, $this->namespaces, $bindingUse, + $this->skipXsiTypeDetection, + ); + } + + public function withSkipXsiTypeDetection(bool $skipXsiTypeDetection): self + { + return new self( + $this->type, + $this->metadata, + $this->registry, + $this->namespaces, + $this->bindingUse, + $skipXsiTypeDetection, ); } } diff --git a/src/Encoder/EncoderDetector.php b/src/Encoder/EncoderDetector.php index 1c81c12..19aeb24 100644 --- a/src/Encoder/EncoderDetector.php +++ b/src/Encoder/EncoderDetector.php @@ -4,7 +4,6 @@ namespace Soap\Encoding\Encoder; use Soap\Engine\Metadata\Model\XsdType; -use Soap\WsdlReader\Model\Definitions\BindingUse; use stdClass; use WeakMap; @@ -61,7 +60,7 @@ private function enhanceEncoder(Context $context, XmlEncoder $encoder): XmlEncod $meta = $context->type->getMeta(); $isSimple = $meta->isSimple()->unwrapOr(false); - if (!$isSimple && !$encoder instanceof Feature\DisregardXsiInformation && $context->bindingUse === BindingUse::ENCODED) { + if (!$isSimple && !$encoder instanceof Feature\DisregardXsiInformation && !$context->skipXsiTypeDetection) { $encoder = new XsiTypeEncoder($encoder); } diff --git a/src/Encoder/SimpleType/EncoderDetector.php b/src/Encoder/SimpleType/EncoderDetector.php index 74eecf3..f42799f 100644 --- a/src/Encoder/SimpleType/EncoderDetector.php +++ b/src/Encoder/SimpleType/EncoderDetector.php @@ -10,7 +10,6 @@ use Soap\Encoding\Encoder\XmlEncoder; use Soap\Encoding\Encoder\XsiTypeEncoder; use Soap\Engine\Metadata\Model\XsdType; -use Soap\WsdlReader\Model\Definitions\BindingUse; use function Psl\Iter\any; final class EncoderDetector @@ -56,7 +55,7 @@ private function enhanceEncoder(Context $context, XmlEncoder $encoder): XmlEncod $encoder = new ElementEncoder($encoder); } - if (!$encoder instanceof Feature\DisregardXsiInformation && $context->bindingUse === BindingUse::ENCODED) { + if (!$encoder instanceof Feature\DisregardXsiInformation && !$context->skipXsiTypeDetection) { $encoder = new XsiTypeEncoder($encoder); } diff --git a/src/TypeInference/XsiTypeDetector.php b/src/TypeInference/XsiTypeDetector.php index d5be07f..c9f07b8 100644 --- a/src/TypeInference/XsiTypeDetector.php +++ b/src/TypeInference/XsiTypeDetector.php @@ -8,7 +8,6 @@ use Soap\Encoding\Encoder\Context; use Soap\Encoding\Encoder\FixedIsoEncoder; use Soap\Engine\Metadata\Model\XsdType; -use Soap\WsdlReader\Model\Definitions\BindingUse; use Soap\WsdlReader\Parser\Xml\QnameParser; use Soap\Xml\Xmlns as SoapXmlns; use VeeWee\Xml\Xmlns\Xmlns; @@ -47,10 +46,6 @@ static function () use ($context, $value) { */ public static function detectXsdTypeFromXmlElement(Context $context, DOMElement $element): Option { - if ($context->bindingUse !== BindingUse::ENCODED) { - return none(); - } - $xsiType = $element->getAttributeNS(Xmlns::xsi()->value(), 'type'); if (!$xsiType) { return none(); @@ -98,7 +93,7 @@ public static function detectEncoderFromXmlElement(Context $context, DOMElement ->withIsRepeatingElement(false); $encoderDetectorContext = $context ->withType($type->withMeta(static fn () => $encoderDetectorTypeMeta)) - ->withBindingUse(BindingUse::LITERAL); + ->withSkipXsiTypeDetection(true); return some( new FixedIsoEncoder(