Be careful with SOAP_FUNCTIONS_ALL, as it adds ALL availiable PHP functions to your server.
This can be a potential security threat, imagine clients doing this:
echo $client->file_get_contents("c:\\my files\\my_passwords.doc");
And voila, they have the contents of your file my_passwords.doc.
SoapServer::addFunction
(PHP 5 >= 5.0.1)
SoapServer::addFunction — Añade una o más funciones al controlador de peticiones SOAP
Descripción
Exporta una o más funciones para clientes remotos
Parámetros
-
functions -
Para exportar una función, pasa el nombre de la función en su parámetro como cadena.
Para exportar varias funciones, pasa un array con el nombre de las funciones.
Para exportar todas las funciones, pasa la constante especial
SOAP_FUNCTIONS_ALL.Nota:
Las
functionsdeben recibir todos los argumentos de entrada en el mismo orden que fueron definidos en el fichero WSDL (no deberían recibir ningún parámetro de salida como argumento) y devolver uno o más valores. Para devolver varios valores deben devolver un array con los nombrados parámetros de salida.
Valores devueltos
No devuelve ningún valor.
Ejemplos
Ejemplo #1 Ejemplos de SoapServer::addFunction()
<?php
function echoString($inputString)
{
return $inputString;
}
$server->addFunction("echoString");
function echoTwoStrings($inputString1, $inputString2)
{
return array("outputString1" => $inputString1,
"outputString2" => $inputString2);
}
$server->addFunction(array("echoString", "echoTwoStrings"));
$server->addFunction(SOAP_FUNCTIONS_ALL);
?>
Ver también
- SoapServer::SoapServer() - Constructor de SoapServer
- SoapServer::setClass() - Define la clase que controla las peticiones SOAP
In response to comment by Nathan O'Sullivan about returning (or passing) a complex type, you can also use the stdClass() object.
Assume you define a complex type like so:
<xsd:complexType name="TestType">
<xsd:all>
<xsd:element name="A" type="xsd:string" />
<xsd:element name="B" type="xsd:int" />
<xsd:element name="C" type="xsd:boolean" />
</xsd:all>
</xsd:complexType>
To use an object in place of an array you can do:
$test = new stdClass();
$test->A = "test string";
$test->B = 45;
$test->C = false;
$result = $client->Test($test);
function Login($username, $password)
{
return array("LoginResult" => array("Id"=>1, "Name"=>"Nathan", "Nickname"=>"Nathan", "Email"=>"email address") );
}
Ok, Only a litte error in the last note.. :
"LoginResult" => array and NOT "LoginResult" , array
You may be left wondering, as I was, how to return a complex type - consider the following WSDL snippets, for a method called Login:
<xs:element name="Login">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="1" name="username" type="xs:string" />
<xs:element minOccurs="0" maxOccurs="1" name="password" type="xs:string" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:complexType name="UserInfo">
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="1" name="Id" type="xs:string" />
<xs:element minOccurs="0" maxOccurs="1" name="Name" type="xs:string" />
<xs:element minOccurs="0" maxOccurs="1" name="Nickname" type="xs:string" />
<xs:element minOccurs="0" maxOccurs="1" name="Email" type="xs:string" />
</xs:sequence>
</xs:complexType>
<xs:element name="LoginResponse">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="1" name="LoginResult" type="s0:UserInfo" />
</xs:sequence>
</xs:complexType>
</xs:element>
Here's a working Login function that I've added with add SoapServer::addFunction
function Login($username, $password)
{
return array("LoginResult", array("Id"=>1, "Name"=>"Nathan", "Nickname"=>"Nathan", "Email"=>"email address") );
}
The UserInfo complextype is represented by the inner array. The outer array has just one element, "LoginResult". The LogineResponse element seems to be treated as a one-member array by PHP.
