Недавно передо мной встал вопрос: организовать SOAP Server для некоторых деяний. Задался идеей реализовать это с помощью Zend_Soap, оказалось предельно просто.
Для примера нам понадобится 4 файла:
Для примера нам понадобится 4 файла:
- server.php — собственно сам SOAP сервер
- wsdl.php — WSDL
- class.php — класс с функциями
- client.php — клиент, как пример работы
server.php
require_once 'Zend/Loader.php';
Zend_Loader::registerAutoload();
include ('class.php');
$server = new Zend_Soap_Server("http://localhost/soap/wsdl.php");
$server->setClass('Server');
$server->handle();
</code>
* This source code was highlighted with Source Code Highlighter.
wsdl.php
require_once 'Zend/Loader.php';
require_once 'class.php';
Zend_Loader::registerAutoload();
$wsdl = new Zend_Soap_AutoDiscover();
$wsdl->setUri('http://localhost/soap/server.php');
$wsdl->setClass('Server');
$wsdl->handle();
* This source code was highlighted with Source Code Highlighter.
server.php — Как видите не несет в себе никакой логики, как и wsdl.php. Они оба ссылаются на класс class.php, в котором уже хранятся функции вызова. Все остальное за вас делает Zend_Soap.
class.php
<?php
class Server {
private $_db;
/**<br/>
* Открываем соеденение с базой данных.<br/>
* Здесь может быть любой другой вам нужный код.<br/>
*/<br/>
function __construct() {
try {
$this->_db = new Zend_Db_Adapter_Oracle(array(
'username' => 'demo',
'password' => 'demo',
'dbname' => '(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(COMMUNITY=tcp.telekom.lv)(PROTOCOL=TCP)(Host=127.0.0.1)(Port=1521)))(CONNECT_DATA=(SID=XE)))'
));
} catch(Zend_Exception $e) {
return array( 'code' => 200,
'error' => 'Database connection error');
}
}
/**<br/>
* Get Simple Demo Action<br/>
*<br/>
* @param array $userData<br/>
* @param array $requestData<br/>
* @return array<br/>
*/<br/>
public function getSimpleAction($userData = array(), $requestData = array()) {
/**<br/>
* $userData = array('username' => '', 'password' => '')<br/>
* $requestData = array('value1' => '', 'value2' => '')<br/>
*/<br/>
if (!$this->_checkCredentials($userData)) {
return array( 'code' => 500,
'error' => 'Неверный логин или пароль.');
}
$array = array();
try {
/**<br/>
* Здесь выполняется ваша обработка и кадаются<br/>
* Zend_Exception если что-то пошло не так.<br/>
* <br/>
* throw new Zend_Exception('Error :(', 100);<br/>
* <br/>
* Или присваиваются в $array переменные,<br/>
* которые должны быть возвращенны.<br/>
* <br/>
* $array['ok'] = 'true';<br/>
*/<br/>
} catch (Zend_Exception $e) {
return array( 'code' => 101,
'error' => 'Exception: ' . $e->getMessage());
}
return $array;
}
private function _checkCredentials($userData) {
/**<br/>
* Функция для проверки подлинности пользователя<br/>
* return true/false<br/>
*/<br/>
return true;
}
/**<br/>
* Закрыть соеденение с базой данных.<br/>
*/<br/>
function __destruct() {
$this->_db->closeConnection();
}
}
* This source code was highlighted with Source Code Highlighter.
Самое главное — это не забывать о комментариях к главным функциям:
/**
* Get Simple Demo Action<br/>
*<br/>
* @param array $userData<br/>
* @param array $requestData<br/>
* @return array<br/>
*/<br/>
* This source code was highlighted with Source Code Highlighter.
Описывать тип параметра то ли это string, array или int. Или любой другой разрешенный.
client.php
require_once 'Zend/Loader.php';
Zend_Loader::registerAutoload();
$client = new Zend_Soap_Client("http://localhost/soap/wsdl.php");
$userdata = array('username' => 'demoUsername', 'password' => 'demoPassword');
$requestData = array('parameter' => 'value');
print_r($client->getSimpleAction($userdata, $requestData));
* This source code was highlighted with Source Code Highlighter.
С помощью клиента просто проверяем работоспособность.
Вот и все, небольшой брифинг по Zend_Soap пройден. В принципе на такой базе, можно строитьпрактическилюбые SOAP апликации.