Я создаю многопротокольный веб-сервис, используя Zend_JSON_Server
и Zend_XmlRpc_Server
, используя PHP 5.2.6.и в настоящее время я сталкиваюсь с проблемой, что сервер теперь объявляет каждый отдельный метод от моих классов и его родителей.
class MyClass extends MyInterface {
/**
* To be published and accessible
**/
public function externalUse() {}
}
class MyInterface {
/**
* This method should not be published using the webservice,
* but needs to be of type "public" for internal use
* @access private
* @ignore
**/
public function internalUseOnly() {}
}
$server = new Zend_Json_Server();
$server->setClass('MyClass');
// show service map
header('Content-Type: text/plain');
$server->setTarget('/service.json')
->setEnvelope(Zend_Json_Server_Smd::ENV_JSONRPC_2);
$smd = $server->getServiceMap();
die($smd);
Этот код также объявляет internalUseOnly
как доступную функцию, используя веб-сервис:
{ "SMDVersion" : "2.0",
"contentType" : "application/json",
"envelope" : "JSON-RPC-2.0",
"methods" : { "externalUse" : { "envelope" : "JSON-RPC-2.0",
"parameters" : [ ],
"returns" : "null",
"transport" : "POST"
},
"internalUseOnly" : { "envelope" : "JSON-RPC-2.0",
"parameters" : [ ],
"returns" : "null",
"transport" : "POST"
}
},
"services" : { "externalUse" : { "envelope" : "JSON-RPC-2.0",
"parameters" : [ ],
"returns" : "null",
"transport" : "POST"
},
"internalUseOnly" : { "envelope" : "JSON-RPC-2.0",
"parameters" : [ ],
"returns" : "null",
"transport" : "POST"
}
},
"target" : "/service.json",
"transport" : "POST"
}
Как видите, я уже пробовал @ignore
и @access private
, но оба игнорируются Reflection.Есть ли другой способ удалить такие функции из моей карты услуг?
Заранее спасибо!
Обновление
Одно решение, которое я нашел, состоит в том, чтобы сделать частные / защищенные методы снова доступными с помощью перегрузки и динамических вызовов функций.Но так как call_user_func
не известен как один из самых быстрых методов, это только исправление.
class MyInterface {
public function __call($method, $params) {
$method = '_' . $method;
if (method_exists($this, $method)) {
call_user_func(array($this, $method), $params);
}
}
/**
* This method should not be published using the webservice,
* but needs to be of type "public" for internal use
* @ignore
* @access private
* @internal
**/
protected function _internalUseOnly() { die('internal use only!'); }
}