Ik ben bezig met een projectje waarbij ik een SOAP service moet schrijven in PHP die moet gaan werken met .Net clients. Het schrijven van de PHP doe ik in Zend Studio, welke voor mij automatisch de WSDL file kan genereren aan de hand van mijn PHP classes. Ik loop echter tegen een probleem aan bij het specificeren van een datatype bij een property van een class.
Dit werkt:
Zend Studio genereert dan een WSDL waarbij het datatype voor de HelloWorld functie "string" is:
Vanuit sommige functies return ik dus mijn eigen objecten:
De GetPerson() method returned dus een Person object. Wat me echter niet lukt is om de Person class dusdanig te 'behangen' zodat Zend Studio ziet dat beide properties van het type "string" zijn.
Zoals je ziet staat bij beide properties "@return string", maar Zend Studio maakt daar in de WSDL het volgende van:
Ik wil dus geen "anyType" maar string. Ik heb ook het volgende geprobeerd:
I.p.v. @return gebruik ik nu dus @property volgens de phpdoc conventies (ik moet wel zeggen dat ik relatief weinig met php doe, dus misschien moet ik op dat vlak nog wat bijgeschaafd worden
) maar Zend Studio maakt daar nog steeds "anyType" van bij de WSDL export.
Doe ik iets verkeerd? Ik kan wel voor elke property een getter/setter functie maken (want bij een functie kan ik het type wél specificeren) maar daar heb ik weinig trek in; dat betekent alle properties private maken, een bak getter/setter code en overal dus getName, setName wat weer niet strookt met de .Net conventies waar de app uiteindelijk toch mee moet babbelen. En omdat de meeste properties weinig spannends zijn is de overhead van getter/setter functies me gewoon teveel.
Dus: weet iemand hoe ik het datatype van een property specificeer zodat Zend Studio bij het genereren van de WSDL het juiste datatype uitpoept?
Dit werkt:
PHP:
1
2
3
4
5
6
7
8
9
10
| class test { /** * Retuns "Hello world" * * @return string */ public function HelloWorld() { return "Hello world"; } } |
Zend Studio genereert dan een WSDL waarbij het datatype voor de HelloWorld functie "string" is:
XML:
1
2
3
| <message name="HelloWorldResponse"> <part name="HelloWorldReturn" type="xsd:string"/> </message> |
Vanuit sommige functies return ik dus mijn eigen objecten:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
| class test { /** * Returns a person * * @return Person */ public function GetPerson() { return new Person ( "RobIII", "SomeAdress 123" ); } } class Person { /** * The name of a person * * @return string */ public $name; /** * The Address of a person * * @return string */ public $address; public function __construct($n, $a) { $this->name = $n; $this->address = $a; } } |
De GetPerson() method returned dus een Person object. Wat me echter niet lukt is om de Person class dusdanig te 'behangen' zodat Zend Studio ziet dat beide properties van het type "string" zijn.
Zoals je ziet staat bij beide properties "@return string", maar Zend Studio maakt daar in de WSDL het volgende van:
XML:
1
2
3
4
5
6
| <xsd:complexType name="Person"> <xsd:all> <xsd:element name="address" type="xsd:anyType"/> <xsd:element name="name" type="xsd:anyType"/> </xsd:all> </xsd:complexType> |
Ik wil dus geen "anyType" maar string. Ik heb ook het volgende geprobeerd:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| /** * Person class * * @property string $name Person's name * @property string $address Person's address */ class Person { public $name; public $address; public function __construct($n, $a) { $this->name = $n; $this->address = $a; } } |
I.p.v. @return gebruik ik nu dus @property volgens de phpdoc conventies (ik moet wel zeggen dat ik relatief weinig met php doe, dus misschien moet ik op dat vlak nog wat bijgeschaafd worden
Doe ik iets verkeerd? Ik kan wel voor elke property een getter/setter functie maken (want bij een functie kan ik het type wél specificeren) maar daar heb ik weinig trek in; dat betekent alle properties private maken, een bak getter/setter code en overal dus getName, setName wat weer niet strookt met de .Net conventies waar de app uiteindelijk toch mee moet babbelen. En omdat de meeste properties weinig spannends zijn is de overhead van getter/setter functies me gewoon teveel.
Dus: weet iemand hoe ik het datatype van een property specificeer zodat Zend Studio bij het genereren van de WSDL het juiste datatype uitpoept?
There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.
Je eigen tweaker.me redirect
Over mij