Доброго времени суток!
Данный пост предназначен для новичков, начинающих разбираться с ООП на 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