Сразу скажу, я не программист php, я только камикадзе :).
Столкнулись тут с проблемой как встроить soap в веб-сервере на yii. Простеньких примеров море, а так чтобы по готовому wsdl нет. Выдается не мой wsdl, а доморощенный, сгенерированный из класса. Пришлось покопаться в коде CWebServiceAction и CWebService. Как оказалось, для получения правильного wsdl нужен Url с хвостом: '
http://server.local/Injector/InjectorService?wsdl'. Собственно так выглядит класс контролера:
class InjectorController extends CController
{
public function actions()
{
return array(
'InjectorService'=>array(
'class'=>'CWebServiceAction',
'wsdlUrl' => 'file:///srv/webhosts/soap/etc/Injector.wsdl',
'serviceVar' => 'wsdl',
'serviceOptions' => array(
'soapVersion' => '1.1',
),
),
);
}
/**
* @param mixed
* @return mixed
* @soap
*/
public function putMessage($input)
{
// TODO тут обрабатываем $input как stdClass
return array(
'ReturnCode' => array(
'Code' => 100,
'Name' => 'Успешно',
'Description' => 'Принято',
),
);
}
}
Пришлось переписать CWebServiceAction (чтоб всегда работать с правильным wsdl):
class StrongWebServiceAction extends CWebServiceAction
{
private $_service;
/**
* Runs the action.
* Allway the action handle the remote method invocation.
*/
public function run()
{
$hostInfo=Yii::app()->getRequest()->getHostInfo();
$controller=$this->getController();
if(($serviceUrl=$this->serviceUrl)===null)
$serviceUrl=$hostInfo.$controller->createUrl($this->getId(),array($this->serviceVar=>1));
if(($wsdlUrl=$this->wsdlUrl)===null)
$wsdlUrl=$hostInfo.$controller->createUrl($this->getId());
if(($provider=$this->provider)===null)
$provider=$controller;
$this->_service=$this->createWebService($provider,$wsdlUrl,$serviceUrl);
if(is_array($this->classMap))
$this->_service->classMap=$this->classMap;
foreach($this->serviceOptions as $name=>$value)
$this->_service->$name=$value;
$this->_service->run();
Yii::app()->end();
}
}
и поменять class в первом примере на StrongWebServiceAction.
Надеюсь мой опыт кому-нибудь сбережет время и нервы. :)