Shi
@Shi

Как правильно использовать SOAP-клиент c Laravel?

Как правильно обращаться к SOAP серверу из контроллера, в котором у меня несколько функций, дергающих разные методы по WSDL линку?

Сейчас у меня в каждой функции присутствует
$client = new SoapClient("http://xxx.xxx.xxx.xxx/ws/WWWAccount.1cws?wsdl",
                [
                    'login' => "", //логин пользователя к базе 1С
                    'password' => "", //пароль пользователя к базе 1С
                    'soap_version' => SOAP_1_2, //версия SOAP
                    'cache_wsdl' => WSDL_CACHE_NONE,
                    'trace' => true,
                    'exceptions' => true
                ]
            );

но чувствую, что это неверно...
  • Вопрос задан
  • 4659 просмотров
Пригласить эксперта
Ответы на вопрос 2
LightAir
@LightAir
LA
Можно вынести в отдельный класс.
Можно вынести в сервис провайдер, для него написать фасад для удобства.
А ещё можно просто использовать готовый пакет

Информация по DI
Информация по IoC
Как написать фасад
Ответ написан
@unreal_serg
Лучше не использовать никаких SOAP клиентов - горя хапнуть можно.
Обычный Http фасад отлично подходит.
Например, отправка запроса на авторизацию к АПИ налоговой.
Метод для контроллера:
private function sendRequest(): string
    {
        $template = view($templateType, [
            'token' => 'master token'
        ])->render()
        $url = 'https://openapi-test.gnivc.ru:8090/open-api/AuthService/0.1';

        $response = Http::withBody($template, 'text/xml')->post($url);

        return $response->body();
    }

Поскольку SOAP использует xml то для этого я использовал blade шаблоны ларки. Они отлично подходят для такого количества синтаксического хлама SOAP (не ругайте за предвзятость. Да, я люблю REST :)).
Шаблон:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns="urn://x-artefacts-gnivc-ru/inplat/servin/OpenApiMessageConsumerService/types/1.0">
    <soapenv:Header/>
    <soapenv:Body>
        <ns:GetMessageRequest>
            <ns:Message>
                <tns:AuthRequest xmlns:tns="urn://x-artefacts-gnivc-ru/ais3/kkt/AuthService/types/1.0">
                    <tns:AuthAppInfo>
                        <tns:MasterToken>{{ $token}}</tns:MasterToken>
                    </tns:AuthAppInfo>
                </tns:AuthRequest>
            </ns:Message>
        </ns:GetMessageRequest>
    </soapenv:Body>
</soapenv:Envelope>


Прилетает такой же всратый ответ в xml.
Далее, я его конвертил в array пхп:
$data = $this->sendRequest();
$response = preg_replace("/(<\/?)(\w+):([^>]*>)/", "$1$2$3", $data );
$xml = new \SimpleXMLElement($response);
$body = $xml->xpath('//soapBody')[0];
$array = json_decode(json_encode((array)$body), TRUE);


Дальше уже получаем более менее сносный массив, а его можно преобразовать в коллекцию или работать прям с ним, как удобнее.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы