Okay, I created a new issue regarding to this problem:
http://framework.zend.com/issues/browse/ZF-1018
-- Jan
Matthew Weier O wrote:
>
> -- Jan Pieper <[EMAIL PROTECTED]> wrote
> (on Wednesday, 07 March 2007, 08:28 AM +0100):
>> My attached files works fine on your maschine? OS? PHP-Version? I am
>> using Windows XP and PHP5.2.0, I actually have no unix based maschine
>> with a php version greater than 5.1.0 to test it on a unix system.
>
> Linux running PHP 5.2.1.
>
>> I turned display_errors and error_reporting off (*) but if I am using a
>> namespace for my methods I´ll always get "Calling parameters do not
>> match signature" (Exception thrown in Zend_XmlRpc_Server:511 because
>> $sigCalled !== $tmpParams) and this is because all parameters method
>> (not request!) are identifed as "void". It seems that the reflection
>> can´t parse the doc-comment. If I change all to a standalone function it
>> works fine.
>
> Actually, I ran the code you provided, which only ran against the
> standalone function. I tried it just now against the class, and it
> worked fine. However, that said, I did find a subtle bug: More than one
> space between the '@param' and the typehint ('int' in this case) caused
> the server to fail. That's easily fixed however, and I'll put an issue
> in the tracker for it.
>
>
>> *) I also tested it by using a normal fsockopen() connection and there
>> never was any notices.
>>
>> /***********************************************************/
>>
>> WON´T WORK:
>>
>> class test
>> {
>> /**
>> * @access public
>> * @param int $iValueA
>> * @param int $iValueB
>> * @return int
>> */
>> public function test($iValueA, $iValueB) {
>> return $iValueA * $iValueB;
>> }
>> }
>>
>> $oXmlRpcServer->setClass('test', 'mytest'); // call: mytest.test
>>
>> /***********************************************************/
>>
>> WORKS FINE:
>>
>> /**
>> * @access public
>> * @param int $iValueA
>> * @param int $iValueB
>> * @return int
>> */
>> function test($iValueA, $iValueB) {
>> return $iValueA * $iValueB;
>> }
>>
>> $oXmlRpcServer->addFunction('test'); // call: test
>>
>> /***********************************************************/
>>
>> -- Jan
>>
>> >-- Jan Pieper <[EMAIL PROTECTED]> wrote
>> >(on Wednesday, 07 March 2007, 12:27 AM +0100):
>> >
>> >>The problem is, that $tmpParams always contains "void" entries and so
>> my
>> >>sent
>> >>request cannot be handled because no signature matchs.
>> >>
>> >>I hope you´ll test my attached code so you´ll see whats my fault. I am
>> >>searching a few days for the error, tested it in many completly
>> different
>> >>test-applications but it only works with standalone functions and that
>> >>is not
>> >>that what I want to use.
>> >>
>> >
>> >I just tried on my machine, and it worked fine... after I changed the
>> >display_errors setting to off in both scripts.
>> >
>> >In particular, you'll want display_errors off in the server script as
>> >any notices or warnings that get emitted by your code will mess with the
>> >XML it returns.
>> >
>> >
>> >>>-- Jan Pieper <[EMAIL PROTECTED]> wrote
>> >>>(on Thursday, 01 March 2007, 11:16 PM +0100):
>> >>>
>> >>>
>> >>>>To not post so "much" code inside this mail I added some attachments.
>> >>>>
>> >>>>Attachments:
>> >>>>- xmlrpc_server.php
>> >>>>- xmlrpc_client.php
>> >>>>- result.txt
>> >>>>
>> >>>>The server gets the correct request (xml) but I don´t know why this
>> >>>>request cannot be handled.
>> >>>>
>> >>>>(btw.: what is i4?)
>> >>>>
>> >>>>
>> >>>Shorthand for integer -- it's a synonym in XML-RPC syntax.
>> >>>
>> >>>Try the following client code and let me know what you get:
>> >>>
>> >>> $connection = new Zend_XmlRpc_Client($URL);
>> >>> $client = $connection-> getProxy();
>> >>> $result = $client-> flabben-> addEntry($uid, $title, $content);
>> >>> var_dump($result);
>> >>>
>> >>>I'm curious to see if there's a subtle issue going on with parameter
>> >>>ordering in the client.
>> >>>
>> >>>
>> >>>
>> >>>
>> >>>>>-- Jan Pieper <[EMAIL PROTECTED]> wrote
>> >>>>>(on Thursday, 01 March 2007, 09:22 PM +0100):
>> >>>>>
>> >>>>>
>> >>>>>
>> >>>>>>My class looks like:
>> >>>>>>
>> >>>>>>class Flabben_XmlRpc_Server
>> >>>>>>{
>> >>>>>> /**
>> >>>>>> * add entry to database and return its id
>> >>>>>> *
>> >>>>>> * @access public
>> >>>>>> * @param integer $iUserId
>> >>>>>> * @param string $sTitle
>> >>>>>> * @param string $sContent
>> >>>>>> * @return integer
>> >>>>>> */
>> >>>>>> public function addEntry($iUserId, $sTitle, $sContent)
>> >>>>>> {
>> >>>>>> return 1;
>> >>>>>> }
>> >>>>>>}
>> >>>>>>
>> >>>>>>
>> >>>>>>
>> >>>>>That looks good -- what is the data being sent to it that's causing
>> the
>> >>>>>error? I'm wondering if one or more items were not the right type?
>> >>>>>Zend_XmlRpc_Server uses Zend_XmlRpc_Value to 'guess' the type; it's
>> >>>>>possible that there's an issue in there. Give as much detail as you
>> >>>>>can,
>> >>>>>and I'll try and track it down.
>> >>>>>
>> >>>>>
>> >>>>>
>> >>>>>
>> >>>>>
>> >>>>>> -- Jan Pieper <[EMAIL PROTECTED]> wrote
>> >>>>>> (on Thursday, 01 March 2007, 07:23 PM +0100):
>> >>>>>>
>> >>>>>>
>> >>>>>> The result I get ist:
>> >>>>>>
>> >>>>>> <?xml version="1.0" encoding="UTF-8"?>
>> >>>>>> <methodResponse> <params> <param> <value> <string/> </value>
>> >>>>>> </param> </params> </
>> >>>>>> methodResponse>
>> >>>>>> Zend_XmlRpc_Client_FaultException caught: Calling parameters
>> do
>> >>>>>> not match
>> >>>>>> signature
>> >>>>>>
>> >>>>>> I can´t find my mistake...
>> >>>>>>
>> >>>>>>
>> >>>>>>
>> >>>>>> Read the docs. :-)
>> >>>>>>
>> >>>>>> The Zend server classes use the Reflection API to determine the
>> >>>>>> dispatchable prototypes -- and determines the number and types
>> for
>> >>>>>> the
>> >>>>>> method parameters and return value. When an incoming request
>> >>>>>> happens, it
>> >>>>>> checks the calling parameters against the registered prototypes.
>> >>>>>> So, if
>> >>>>>> the calling parameters do not match, you get that message.
>> >>>>>>
>> >>>>>> The fix? Make sure that you do your docblocks thoroughly:
>> >>>>>>
>> >>>>>> /**
>> >>>>>> * do something with a table
>> >>>>>> *
>> >>>>>> * @param string $table
>> >>>>>> * @param int $id
>> >>>>>> * @param struct $values (Struct denotes an assoc array)
>> >>>>>> * @return boolean
>> >>>>>> */
>> >>>>>> public function doSomething($table, $id, $values);
>> >>>>>>
>> >>>>>> Just make sure you use valid xml-rpc types for the typehints --
>> >>>>>> struct
>> >>>>>> for associative arrays, int(eger), bool(ean), float/double,
>> array,
>> >>>>>> string, base64, date.iso9601 (dates).
>> >>>>>>
>> >>>>>> Also, you *can* OR the types if more than one type is possible:
>> >>>>>>
>> >>>>>> /**
>> >>>>>> * Do something
>> >>>>>> *
>> >>>>>> * @param string $table
>> >>>>>> * @param int|string $id
>> >>>>>> * @param string|struct $values
>> >>>>>> * @return boolean
>> >>>>>> */
>> >>>>>>
>> >>>>>> (The above will have 4 valid prototypes.)
>> >>>>>>
>> >>>>>>
>> >>>>>>
>> >>>>>> -- Werner <[EMAIL PROTECTED]> wrote
>> >>>>>> (on Thursday, 01 March 2007, 06:42 PM +0200):
>> >>>>>>
>> >>>>>>
>> >>>>>> I also want to start playing around with it for an
>> >>>>>> upcoming project.
>> >>>>>>
>> >>>>>> Would you mind posting the skeleton on the list? (to
>> >>>>>> me, the list also
>> >>>>>> serves as a repository (and archive) of code
>> snippets,
>> >>>>>> etc.
>> >>>>>>
>> >>>>>> I love searching for keywords and topics in the list
>> >>>>>> with my mail
>> >>>>>> client, it has proven to be a useful resource to me
>> >>>>>> many times before.
>> >>>>>> Therefore, I would like to ask you to please put as
>> >>>>>> much example code in
>> >>>>>> the list as possible, since you are knowledgeable and
>> >>>>>> it provides a
>> >>>>>> general answer (or starting point) to
>> list-subscribers.
>> >>>>>>
>> >>>>>> Thank you for your time and effort,
>> >>>>>> Werner
>> >>>>>>
>> >>>>>> Matthew Weier O'Phinney wrote:
>> >>>>>>
>> >>>>>>
>> >>>>>> I have. Contact me off-list, and I'll provide a
>> >>>>>> skeleton for you.
>> >>>>>>
>> >>>>>>
>> >>>>>>
>> >>>>>> Okay, it's below.
>> >>>>>>
>> >>>>>> There are some points where you'll need to modify it
>> >>>>>> (require service
>> >>>>>> classes and attach them to the server, specify path to a
>> >>>>>> cache file,
>> >>>>>> specify exception classes that may return XML-RPC faults,
>> >>>>>> etc.).
>> >>>>>> Additionally, you may want to add some logging
>> >>>>>> functionality surrounding
>> >>>>>> the handle() call -- log the request and response, for
>> >>>>>> instance, or just
>> >>>>>> log request/response when fault responses occur.
>> >>>>>>
>> >>>>>>
>> =============================================================
>> >>>>>> <?php
>> >>>>>> // Turn of error reporting; mucks with XML responses
>> >>>>>> ini_set('display_errors', false);
>> >>>>>>
>> >>>>>> /** Zend_Controller_Action */
>> >>>>>> require_once 'Zend/Controller/Action.php';
>> >>>>>>
>> >>>>>> /** Zend_XmlRpc_Server */
>> >>>>>> require_once 'Zend/XmlRpc/Server.php';
>> >>>>>>
>> >>>>>> /** Zend_XmlRpc_Server_Cache */
>> >>>>>> require_once 'Zend/XmlRpc/Server/Cache.php';
>> >>>>>>
>> >>>>>> /** Zend_XmlRpc_Server_Fault */
>> >>>>>> require_once 'Zend/XmlRpc/Server/Fault.php';
>> >>>>>>
>> >>>>>> /**
>> >>>>>> * Also load your service classes here:
>> >>>>>> * require_once 'Services/Foo.php'; // etc.
>> >>>>>> */
>> >>>>>>
>> >>>>>> /**
>> >>>>>> * XMLRPC Controller: dispatch XMLRPC requests
>> >>>>>> *
>> >>>>>> * URI route is: /xml-rpc
>> >>>>>> *
>> >>>>>> * Any additional URI components will be ignored.
>> >>>>>> *
>> >>>>>> * @uses Zend_Controller_Action
>> >>>>>> * @uses Zend_XmlRpc_Server
>> >>>>>> */
>> >>>>>> class XmlRpcController extends Zend_Controller_Action
>> >>>>>> {
>> >>>>>> /**
>> >>>>>> * Override and/or set this to specify a server cache
>> >>>>>> file
>> >>>>>> * @var string
>> >>>>>> */
>> >>>>>> public $cacheFile;
>> >>>>>>
>> >>>>>> /**
>> >>>>>> * Array of exception classes that can be reported as
>> >>>>>> XML-RPC faults.
>> >>>>>> * Override or set this value.
>> >>>>>> * @var array
>> >>>>>> */
>> >>>>>> public $validExceptionClasses = array();
>> >>>>>>
>> >>>>>> /**
>> >>>>>> * Sets the cache file to a sane default if not set
>> >>>>>> *
>> >>>>>> * @return void
>> >>>>>> */
>> >>>>>> public function init()
>> >>>>>> {
>> >>>>>> if (null === $this-> cacheFile) {
>> >>>>>> $this-> cacheFile = dirname(__FILE__) .
>> >>>>>> '/../cache/xmlrpc.cache';
>> >>>>>> }
>> >>>>>> }
>> >>>>>>
>> >>>>>> /**
>> >>>>>> * Index action: dispatch xmlrpc server
>> >>>>>> *
>> >>>>>> * @return void
>> >>>>>> */
>> >>>>>> public function indexAction()
>> >>>>>> {
>> >>>>>> $this-> dispatchXmlrpc();
>> >>>>>> }
>> >>>>>>
>> >>>>>> /**
>> >>>>>> * Forward to indexAction()
>> >>>>>> *
>> >>>>>> * @param string $method
>> >>>>>> * @param array $args
>> >>>>>> * @return void
>> >>>>>> */
>> >>>>>> public function __call($method, $args)
>> >>>>>> {
>> >>>>>> return $this-> _forward('index');
>> >>>>>> }
>> >>>>>>
>> >>>>>> /**
>> >>>>>> * Dispatch XMLRPC server
>> >>>>>> *
>> >>>>>> * @access public
>> >>>>>> * @return void
>> >>>>>> */
>> >>>>>> public function dispatchXmlrpc()
>> >>>>>> {
>> >>>>>> $server = new Zend_XmlRpc_Server();
>> >>>>>>
>> >>>>>> // Ortus_Exceptions will be returned as fault
>> >>>>>> responses
>> >>>>>> foreach ($this-> validExceptionClasses as $class)
>> {
>> >>>>>>
>> Zend_XmlRpc_Server_Fault::attachFaultException($class);
>> >>>>>> }
>> >>>>>>
>> >>>>>> if (!Zend_XmlRpc_Server_Cache::get($this->
>> >>>>>> cacheFile, $server)) {
>> >>>>>> /**
>> >>>>>> * Attach XML-RPC classes, with optional
>> >>>>>> namespaces. Example:
>> >>>>>> * $server-> setClass('Service_Foo', 'foo');
>> >>>>>> * $server-> setClass('Model_Bar', 'bar');
>> >>>>>> */
>> >>>>>>
>> >>>>>> Zend_XmlRpc_Server_Cache::save($this->
>> >>>>>> cacheFile, $server);
>> >>>>>> }
>> >>>>>>
>> >>>>>> // Dispatch request...
>> >>>>>> $response = $server-> handle();
>> >>>>>> $response-> setEncoding('ISO-8859-1');
>> >>>>>> header('Content-Type: text/xml;
>> >>>>>> charset=ISO-8859-1');
>> >>>>>> echo $response-> saveXml();
>> >>>>>> }
>> >>>>>> }
>> >>>>>>
>> >>>>>>
>> >>>>>>
>> >>>>>>
>> >>>>>>
>> >>>>>>
>> >>>>>>
>> >>>>>>
>> >>>>>>
>> >>>>>>
>> >>>>>>
>> >>>>>>
>> >>>>>>
>> >>>>>>
>> >>>>>>
>> >>>>>
>> >>>>>
>> >>>
>> >>>
>> >>>>----- REQUEST
>> >>>>------------------------------------------------------------------
>> >>>>
>> >>>><?xml version="1.0" encoding="UTF-8"?>
>> >>>><methodCall> <methodName> flabben.addEntry</methodName> <params>
>> >>>><param> <value> <int> 1</int> </value> </param> <param> <value>
>> >>>><string> Test</string> </value> </param> <param> <value> <string>
>> >>>>Huhu</string> </value> </param> </params> </methodCall>
>> >>>>
>> >>>>----- RESPONSE
>> >>>>-----------------------------------------------------------------
>> >>>>
>> >>>><?xml version="1.0" encoding="UTF-8"?>
>> >>>><methodResponse> <params> <param> <value> <string/> </value> </param>
>> >>>></params> </methodResponse>
>> >>>>
>> >
>> >
>>
>
> --
> Matthew Weier O'Phinney
> PHP Developer | [EMAIL PROTECTED]
> Zend - The PHP Company | http://www.zend.com/
>
>
--
View this message in context:
http://www.nabble.com/Zend_XmlRpc_Server---Controller-tf3323336s16154.html#a9352215
Sent from the Zend Framework mailing list archive at Nabble.com.