Как стать автором
Обновить

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

PHPООП
Из песочницы
Доброго времени суток!

Данный пост предназначен для новичков, начинающих разбираться с ООП на 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();
}
Теги:SoapphpООП
Хабы: PHP ООП
Всего голосов 19: ↑8 и ↓11 -3
Просмотры3.5K

Похожие публикации

Symfony / PHP developer
до 180 000 ₽ФинФортКраснодарМожно удаленно
Senior PHP Developer
от 180 000 до 250 000 ₽BitrixКалининградМожно удаленно
PHP-программист
от 100 000 ₽РыбачОКСанкт-ПетербургМожно удаленно
PHP разработчик
от 180 000 до 280 000 ₽IBLSМоскваМожно удаленно
PHP Developer
от 120 000 до 150 000 ₽Группа проектов М1-shopМожно удаленно

Лучшие публикации за сутки