1

我需要在 CakePHP 控制器中实现 SOAP 服务。公开的函数名称需要在全局命名空间中(如“Authenticate”,而不是“SOAPController.Authenticate”)。这迫使我在全局命名空间中实现 Authenticate,因为 nuSOAP 会从函数的名称中推断出在哪里寻找函数。另一方面,在下面的示例中,我无法使用 CakePHP 的 API,因为我无法访问 SOAPController 的this. 这就是为什么我认为我应该以某种方式声明某种闭包,它将解析为全局范围内的“身份验证”,同时保持对this通过绑定参数的引用。那可能吗?下面是错误的代码:

<?php
App::uses('AppController', 'Controller');
App::import('Vendor', 'nusoap', 
        array('file' => 'nusoap'.DS.'lib'.DS.'nusoap.php')
);
/**
 * SOAP Controller
 *
 */


class SOAPController extends AppController {

        public function index()
        {
                $namespace = '';
                $server = new soap_server();
                $server->debug_flag = false;
                $server->configureWSDL("PAI2WSDL", $namespace,
                        "http://localhost/pai2/SOAP/?wsdl");
                $server->wsdl->schemaTargetNamespace = $namespace;

                function Authenticate($login,$haslo){
                        $this->log("TEST"); //won't work!
                        return true;
                }

                $server->register('Authenticate',
                  array('ContractorId' => 'xsd:int', 'Password'=>'xsd:string'), 
                  array('return' => 'xsd:boolean'),
                  $namespace,
                 $namespace . '#Authenticate',
                  'rpc',
                  'encoded'
                );

                $HTTP_RAW_POST_DATA = isset($GLOBALS['HTTP_RAW_POST_DATA'])
                          ? $GLOBALS['HTTP_RAW_POST_DATA'] : '';
                $server->service($HTTP_RAW_POST_DATA);
                $this->autoRender = false;
                exit();
        }
}
4

0 回答 0