<?php
namespace App\InsuranceCompany\DZI\SOAP\Subscriber;
use App\InsuranceCompany\Common\Type\ResultProviderInterface;
use App\InsuranceCompany\DZI\Exception\Exception;
use App\InsuranceCompany\DZI\SOAP\Interfaces\ChangePassRespInterface;
use App\InsuranceCompany\DZI\SOAP\Interfaces\ErrorMessageInterface;
use App\InsuranceCompany\DZI\SOAP\Interfaces\NoStatusResponseInterface;
use App\InsuranceCompany\DZI\SOAP\Interfaces\StatusCodeResultInterface;
use App\InsuranceCompany\DZI\SOAP\Interfaces\StatusMessageResultInterface;
use App\InsuranceCompany\DZI\SOAP\Interfaces\StatusMsgResultInterface;
use App\InsuranceCompany\DZI\SOAP\Interfaces\StatusNoResultInterface;
use App\InsuranceCompany\DZI\SOAP\Interfaces\StatusResultInterface;
use Phpro\SoapClient\Event\ResponseEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use UnexpectedValueException;
/**
* Class ErrorHandlingSubscriber
*/
class ErrorHandlingSubscriber implements EventSubscriberInterface
{
/**
* @param ResponseEvent $event
* @throws Exception
*/
public function onClientResponse(ResponseEvent $event)
{
$result = $event->getResponse();
while ($result instanceof ResultProviderInterface) {
$result = $result->getResult();
}
if ($result instanceof StatusNoResultInterface) {
$statusCode = $result->getStatusNo();
}
elseif ($result instanceof StatusCodeResultInterface) {
$statusCode = $result->getStatusCode();
}
elseif ($result instanceof StatusResultInterface) {
$statusCode = (int)$result->getStatus();
}
elseif ($result instanceof NoStatusResponseInterface) {
return;
}
else {
throw new UnexpectedValueException('Result type is not a result');
}
if ($statusCode === 0) {
return;
}
if ($result instanceof StatusMessageResultInterface) {
$message = $result->getStatusMessage();
}
elseif ($result instanceof StatusMsgResultInterface) {
$message = $result->getStatusMsg();
}
elseif ($result instanceof ChangePassRespInterface) {
$message = $result->getChangePassResp();
}
elseif ($result instanceof ErrorMessageInterface) {
$message = $result->getErrorMessage();
}
else {
$message = 'Unknown error';
}
throw new Exception($message, $statusCode);
}
/**
* {@inheritdoc}
* @noinspection PhpArrayShapeAttributeCanBeAddedInspection
*/
public static function getSubscribedEvents(): array
{
return [
ResponseEvent::class => 'onClientResponse',
];
}
}