Previous Entry Share
Пусть всем светит солнце!
котяра
zzfi
Сразу скажу, я не программист 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.


Надеюсь мой опыт кому-нибудь сбережет время и нервы. :)
Tags: , ,

?

Log in