我需要在CakePHP控制器中实现SOAP服务。公开的函数名称必须位于全局名称空间中(如“Authenticate”,而不是“SOAPController.Authenticate”)。这迫使我在全局命名空间中实现Authenticate,因为nuSOAP将推断从其名称中查找函数的位置。另一方面,在下面的示例中,我不能使用CakePHP的API,因为我无法访问SOAPController的this
。这就是为什么我认为我应该以某种方式声明某种闭包,它将在全局范围内解析为'Authenticate',同时通过bound参数保持对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();
}
}