Da Zend nicht wirklich RESTful ist, ist JSON-Rpc leider die beste Lösung.
Sie können es in einem Controller zu tun, oder Sie können nur eine ajax.php zusätzlich zu Ihrem index.php zu reduzieren Overhead wie dieser Kerl tat ici
Im Grunde ist alles, was Sie tun müssen, Folgendes:
$server = new Zend_Json_Server();
$server->setClass('My_Class_With_Public_Methods');
// I've found that a lot of clients only support 2.0
$server->getRequest()->setVersion("2.0");
if ('GET' == $_SERVER['REQUEST_METHOD']) {
// Indicate the URL endpoint, and the JSON-RPC version used:
$server->setTarget('/ajax.php')
->setEnvelope(Zend_Json_Server_Smd::ENV_JSONRPC_2);
// Grab the SMD
$smd = $server->getServiceMap();
// Return the SMD to the client
header('Content-Type: application/json');
echo $smd;
return;
}
$server->handle();
dann irgendwo in Ihrem Layout:
$server = new Zend_Json_Server();
$server->setClass('My_Class_With_Public_Methods');
$smd = $server->getServiceMap();
?>
<script>
$(document).ready(function() {
rpc = jQuery.Zend.jsonrpc({
url : <?=json_encode($this->baseUrl('/ajax'))?>
, smd : <?=$smd?>
, async : true
});
});
</script>
Um ein Beispiel zu geben, hier ist diese Klasse:
class My_Class_With_Public_Methods {
/**
* Be sure to properly phpdoc your methods,
* the rpc clients like it when you do
*
* @param float $param1
* @param float $param2
* @return float
*/
public function someMethodInThatClass ($param1, $param2) {
return $param1 + $param2;
}
}
dann können Sie einfach Methoden wie so in Javascript aufrufen:
rpc.someMethodInThatClass(first_param, second_param, {
// if async = true when you setup rpc,
// then the last param is an object w/ callbacks
'success' : function(data) {
}
'error' : function(data) {
}
});
Es gibt nicht viele bekannte JSON-rpc Bibliotheken für Android / iPhone - aber ich habe festgestellt, dass dies mit Zend_Json_Server für Android funktioniert:
http://software.dzhuvinov.com/json-rpc-2.0-base.html
und das funktioniert für das iPhone:
http://www.dizzey.com/development/ios/calling-json-rpc-webservice-in-ios/
Von hier aus können Sie natürlich My_Class_With_Public_Methods auf die gleiche Weise verwenden, wie es Javascript / Ihre mobile App tut.