Расширяем класс работы с SOAP на PHP

в 9:12, , рубрики: php, soap, ооп, Песочница, метки: , ,

Доброго времени суток!

Данный пост предназначен для новичков, начинающих разбираться с ООП на php, и старающихся действовать в соответствии с этим стилем.

Речь пойдет о расширении класса SoapClient(). Что это такое, и с чем его едят, вкупе с установкой — описано в этом посте.

Конкретно я задался вопросом работы с soap, когда на работе получил задачу о взаимодействии наших приложений с серверами заказчика. Т.к. большинство логики в наших приложениях написано в процедурном стиле, то и я изначально собирался запихнуть работу с soap в несколько функций. Но когда понял, что получается по меньшей мере — некрасиво, очень громоздко, и довольно-таки неудобно, решил расширить класс SoapClient.

Итак, приступим.

Передо мной была поставлена задача — разработать логику системы взаимодействия приложения с сервером заказчика для получения различных данных. Все методы приводить не буду, рассмотрю на примере одного: получить ФИО менеджера по названию компании и коду региона.

В гугле информации было немного, но повинуясь чистой логике у меня получился такой-вот класс:

class SoapCrmClient extends SoapClient {

	function getPersonaByCompany($companyName, $regionCode) {
		$dataSoap = $this->FindByCompany(array("CompanyName"=>$companyName, "RegionCode"=>$regionCode));
		return $dataSoap->FindByCompanyResult;
	}

}

Работа с soap велась в wsdl-режиме, и создавать экземпляры класса, всегда прописывая путь к одному wsdl файлу не хотелось, поэтому была добавлена функция __construct():

	function __construct() {
		$this->SoapClient("data/Service1.wsdl");
	}

Также, приложения, с которыми я работаю, в силу некоторых факторов — в кодировке cp1251, а SOAP работает с utf-8. Изначально — я написал громоздкую конструкцию с использованием mb_convert_encoding, но, обратившись к документации класса SoapClient увидел следующее:
В ряду параметров, которые принимает SoapClient — есть параметр encoding — кодировка, из которой (на входе), и в которую (на выходе) преобразует данные Soap. Используем так:

	function __construct() {
		$this->SoapClient("data/Service1.wsdl", array('encoding'=>'CP1251'));
	}

Теперь объединяем все:

class SoapCrmClient extends SoapClient {

	function __construct() {
		$this->SoapClient("data/Service1.wsdl", array('encoding'=>'CP1251'));
	}

	function getPersonaByCompany($companyName, $regionCode) {
		$dataSoap = $this->FindByCompany(array("CompanyName"=>$companyName, "RegionCode"=>$regionCode));
		return $dataSoap->FindByCompanyResult;
	}

}

Работаем так:

try {
	$client = new SoapCrmClient();
	$persona = $client->getPersonaByCompany('Майкрософт', 1);
} catch (SoapFault $e) { // ошибка SOAP канала
	echo 'Ошибка SOAP-канала! '. $e->getMessage();
}

Автор: NikolasSumrak

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js