Zend Framework oferuje kilka sposobów na obsługę web service. Najprostszym z nich jest Zend_Soap. Jedyną funkcjonalnością, która odróżnia Zend_Soap od rozszerzenia Soap dostępnego w PHP, jest Zend_Soap_AutoDiscover. W skrócie Zend_Soap_AutoDiscover pozwala na wygenerowanie pliku WSDL na podstawie metod klasy, przekazanych do Zend_Soap.

Tworzenie usługi sieciowej zaczniemy od napisania nowego kontrolera. Aby zapewnić poprawne działanie serwera Soap, musimy wyłączyć layout oraz zablokować renderowanie widoku. Najlepiej wykonać te czynności w metodzie init, dzięki czemu nie trzeba będzie wykonywać tego w każdej metodzie udostępniającej serwer Soap.

class SoapController extends Zend_Controller_Action
{
	public function init()
	{
		$this->_helper->getHelper('Layout')->disableLayout();
		$this->_helper->getHelper('ViewRenderer')->setNoRender(true);
	}
}

Następnie musimy stworzyć akcję, która będzie naszym serwerem. Nie musimy ograniczać się do jednej akcji. Jeśli jest taka potrzeba, można stworzyć kilka akcji, a w każdej inny serwer Soap. Nie musimy się ograniczać tylko do serwera. Jak wspomniałem na początku, Zend Framework oferuje generowanie pliku WSDL na podstawie klasy i metod tej klasy. Jedynym wymogiem jest poprawne opisanie klasy i metod przy pomocy komentarzy PHPDoc.

public function indexAction()
{
	if(isset($_GET['wsdl'])) {
		$soapAutoDiscover = new Zend_Soap_AutoDiscover();
		$soapAutoDiscover->setClass('App_Soap_SomeClass');
		$soapAutoDiscover->handle();
	}
	else {
		$options = array(
			'uri' => 'tutaj-powinien-byc-poprawny-uri'
		);
		
		$exceptions = array('Exception', 'Zend_Exception');
		
		$server = new Zend_Soap_Server(null, $options);
		$server->setClass('App_Soap_SomeClass');
		$server->registerFaultException($exceptions);
		$server->handle();
	}
}

Instrukcja warunkowa sprawdza, czy klient zgłosił żądanie do pliku WSDL. Wyglądałoby to w następujący sposób:

http://jakas-domena.pl/soap?wsdl

W takim przypadku, obsługą zajmuje się klasa Zend_Soap_AutoDiscover, która na podstawie komentarzy w kodzie, tworzy WSDL. Bardzo ważne jest, by wszystkie metody były poprawnie opisane.

Jeśli WSDL nie jest wymagany przez klienta, wówczas obsługą żądanie zajmuje się Zend_Soap_Server, który działa tak samo jak standardowe rozszerzenie Soap w PHP. Dodatkową funkcjonalnością jest możliwość zarejestrowania listy klas wyjątków, które mogą zostać rzucone podczas przetwarzania żądania. Zarejestrowane klasy wyjątków zgłoszą błąd w stylu Soap. Wszystkie inne rzucone wyjątki, zostaną rozpoznane jako “Unknown error”.

Cały kontroler prezentuje się tak:

class SoapController extends Zend_Controller_Action
{
	public function init()
	{
		$this->_helper->getHelper('Layout')->disableLayout();
		$this->_helper->getHelper('ViewRenderer')->setNoRender(true);
	}
	
	public function indexAction()
	{
		if(isset($_GET['wsdl'])) {
			$soapAutoDiscover = new Zend_Soap_AutoDiscover();
			$soapAutoDiscover->setClass('App_Soap_SomeClass');
			$soapAutoDiscover->handle();
		}
		else {
			$options = array(
				'uri' => 'tutaj-powinien-byc-poprawny-uri'
			);
			
			$exceptions = array('Exception', 'Zend_Exception');
			
			$server = new Zend_Soap_Server(null, $options);
			$server->setClass('App_Soap_SomeClass');
			$server->registerFaultException($exceptions);
			$server->handle();
		}
	}
}