TigerZF
🌐Español

66.3. Descriptor de WSDL

[Note] Nota

La clase Zend_Soap_Wsdl es utilizada internamente por el componente Zend_Soap_Server para operar con documentos WSDL. Sin embargo, también puede utilizar la funcionalidad proporcionada por esta clase para sus propias necesidades. El paquete Zend_Soap_Wsdl contiene tanto un analizador como un constructor de documentos WSDL.

Si no planea hacer esto, puede omitir esta sección de la documentación.

66.3.1. Constructor de Zend_Soap_Wsdl

El constructor de Zend_Soap_Wsdl recibe tres parámetros:

  1. $name - nombre del servicio web que se está describiendo.
  2. $uri - URI donde estará disponible el WSDL (también puede ser una referencia a un archivo en el sistema de archivos.)
  3. $strategy - indicador opcional utilizado para identificar la estrategia de detección de tipos complejos (objetos). Antes de la versión 1.7 esto era un booleano $extractComplexTypes y todavía puede establecerse como booleano por compatibilidad con versiones anteriores. Por defecto se establece el comportamiento de detección de la versión 1.6. Para obtener más información sobre las estrategias de detección de tipos complejos, vaya a la sección: Añadir tipos complejos.

66.3.2. Método addMessage()

El método addMessage($name, $parts) añade una nueva descripción de mensaje al documento WSDL (elemento /definitions/message).

Cada mensaje corresponde a métodos en términos de la funcionalidad de Zend_Soap_Server y Zend_Soap_Client.

El parámetro $name representa el nombre del mensaje.

El parámetro $parts es un array de partes del mensaje que describen los parámetros de la llamada SOAP. Es un array asociativo: 'nombre de la parte' (nombre del parámetro de la llamada SOAP) => 'tipo de la parte'.

La gestión del mapeo de tipos se realiza mediante los métodos addTypes(), addTypes() y addComplexType() (ver más abajo).

[Note] Nota

Las partes de los mensajes pueden utilizar el atributo 'element' o 'type' para su tipado (ver http://www.w3.org/TR/wsdl#_messages).

El atributo 'element' debe referirse a un elemento correspondiente de la definición del tipo de dato. El atributo 'type' se refiere a una entrada complexType correspondiente.

Todos los tipos XSD estándar tienen definiciones tanto de 'element' como de 'complexType' (ver http://schemas.xmlsoap.org/soap/encoding/).

Todos los tipos no estándar, que pueden añadirse utilizando el método Zend_Soap_Wsdl::addComplexType(), se describen utilizando el nodo 'complexType' de la sección '/definitions/types/schema/' del documento WSDL.

Por lo tanto, el método addMessage() siempre utiliza el atributo 'type' para describir los tipos.

66.3.3. Método addPortType()

El método addPortType($name) añade un nuevo tipo de puerto al documento WSDL (/definitions/portType) con el nombre de tipo de puerto especificado.

Este une un conjunto de métodos del servicio web definidos en términos de la implementación de Zend_Soap_Server.

Ver http://www.w3.org/TR/wsdl#_porttypes para más detalles.

66.3.4. Método addPortOperation()

El método addPortOperation($portType, $name, $input = false, $output = false, $fault = false) añade una nueva operación de puerto al tipo de puerto especificado del documento WSDL (/definitions/portType/operation).

Cada operación de puerto corresponde a un método de clase (si el servicio web se basa en una clase) o a una función (si el servicio web se basa en un conjunto de métodos) en términos de la implementación de Zend_Soap_Server.

También añade los mensajes de operación de puerto correspondientes según los parámetros $input, $output y $fault especificados.

[Note] Nota

El componente Zend_Soap_Server genera dos mensajes para cada operación de puerto al describir un servicio basado en la clase Zend_Soap_Server:

  • mensaje de entrada con el nombre $methodName . 'Request'.

  • mensaje de salida con el nombre $methodName . 'Response'.

Ver http://www.w3.org/TR/wsdl#_request-response para más detalles.

66.3.5. Método addBinding()

El método addBinding($name, $portType) añade una nueva vinculación al documento WSDL (/definitions/binding).

El nodo 'binding' del documento WSDL define el formato de mensaje y los detalles del protocolo para las operaciones y mensajes definidos por un portType concreto (ver http://www.w3.org/TR/wsdl#_bindings).

El método crea el nodo de vinculación y lo devuelve. Después puede utilizarse para rellenarlo con datos reales.

La implementación de Zend_Soap_Server utiliza el nombre $serviceName . 'Binding' para el elemento 'binding' del documento WSDL.

66.3.6. Método addBindingOperation()

El método addBindingOperation($binding, $name, $input = false, $output = false, $fault = false) añade una operación a un elemento de vinculación (/definitions/binding/operation) con el nombre especificado.

Recibe como entrada el objeto XML_Tree_Node devuelto por addBinding() (parámetro $binding) para añadir el elemento 'operation' con entradas de entrada/salida/fallo dependiendo de los parámetros especificados.

La implementación de Zend_Soap_Server añade la entrada de vinculación correspondiente para cada método del servicio web con entradas de entrada y salida que definen el elemento 'soap:body' como '<soap:body use="encoded" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>

Ver http://www.w3.org/TR/wsdl#_bindings para más detalles.

66.3.7. Método addSoapBinding()

El método addSoapBinding($binding, $style = 'document', $transport = 'http://schemas.xmlsoap.org/soap/http') añade una entrada de vinculación SOAP ('soap:binding') al elemento de vinculación (que ya está enlazado a algún tipo de puerto) con el estilo y transporte especificados (la implementación de Zend_Soap_Server utiliza el estilo RPC sobre HTTP).

El elemento '/definitions/binding/soap:binding' se utiliza para indicar que la vinculación está unida al formato de protocolo SOAP.

Ver http://www.w3.org/TR/wsdl#_bindings para más detalles.

66.3.8. Método addSoapOperation()

El método addSoapOperation($binding, $soap_action) añade una entrada de operación SOAP ('soap:operation') al elemento de vinculación con la acción especificada. El atributo 'style' del elemento 'soap:operation' no se utiliza ya que el modelo de programación (orientado a RPC o a documentos) puede utilizarse mediante el método addSoapBinding().

El atributo 'soapAction' del elemento '/definitions/binding/soap:operation' especifica el valor de la cabecera SOAPAction para esta operación. Este atributo es obligatorio para SOAP sobre HTTP y no debe especificarse para otros transportes.

La implementación de Zend_Soap_Server utiliza $serviceUri . '#' . $methodName como nombre de acción de la operación SOAP.

Ver http://www.w3.org/TR/wsdl#_soap:operation para más detalles.

66.3.9. Método addService()

El método addService($name, $port_name, $binding, $location) añade el elemento '/definitions/service' al documento WSDL con el nombre de servicio web, nombre de puerto, vinculación y ubicación especificados.

WSDL 1.1 permite tener varios tipos de puerto (conjuntos de operaciones) por servicio. Esta capacidad no se utiliza en la implementación de Zend_Soap_Server y no está soportada por la clase Zend_Soap_Wsdl.

La implementación de Zend_Soap_Server utiliza:

  • $name . 'Service' como nombre del servicio web,

  • $name . 'Port' como nombre del tipo de puerto,

  • 'tns:' . $name . 'Binding' [26] como nombre de vinculación,

  • el URI del script [27] como URI de servicio para la definición del servicio web mediante clases.

donde $name es el nombre de la clase para el modo de definición del servicio web basado en clase, y el nombre del script para el modo de definición del servicio web basado en un conjunto de funciones.

Ver http://www.w3.org/TR/wsdl#_services para más detalles.

66.3.10. Mapeo de tipos

La implementación del descriptor de WSDL de Zend_Soap utiliza el siguiente mapeo de tipos entre tipos PHP y SOAP:

  • cadenas PHP <-> xsd:string.

  • enteros PHP <-> xsd:int.

  • flotantes y dobles PHP <-> xsd:float.

  • booleanos PHP <-> xsd:boolean.

  • arrays PHP <-> soap-enc:Array.

  • objeto PHP <-> xsd:struct.

  • clase PHP <-> basado en la estrategia de tipos complejos (ver: esta sección) [28].

  • void PHP <-> tipo vacío.

  • Si el tipo no coincide con ninguno de estos tipos por algún motivo, entonces se utiliza xsd:anyType.

Donde xsd: es el espacio de nombres "http://www.w3.org/2001/XMLSchema", soap-enc: es el espacio de nombres "http://schemas.xmlsoap.org/soap/encoding/", tns: es el "espacio de nombres de destino" (target namespace) de un servicio.

66.3.10.1. Obtención de información de tipos

El método getType($type) puede utilizarse para obtener el mapeo de un tipo PHP especificado:

...
$wsdl = new Zend_Soap_Wsdl('My_Web_Service', $myWebServiceUri);

...
$soapIntType = $wsdl->getType('int');

...
class MyClass {
    ...
}
...
$soapMyClassType = $wsdl->getType('MyClass');

66.3.10.2. Adición de información de tipos complejos

El método addComplexType($type) se utiliza para añadir tipos complejos (clases PHP) a un documento WSDL.

Es utilizado automáticamente por el método getType() para añadir los tipos complejos correspondientes de los parámetros de método o los tipos de retorno.

Su algoritmo de detección y construcción se basa en la estrategia de detección activa actualmente para tipos complejos. Puede establecer la estrategia de detección especificando el nombre de la clase como cadena o una instancia de una implementación de Zend_Soap_Wsdl_Strategy_Interface como tercer parámetro del constructor, o utilizando la función setComplexTypeStrategy($strategy) de Zend_Soap_Wsdl. Las siguientes estrategias de detección existen actualmente:

  • Clase Zend_Soap_Wsdl_Strategy_DefaultComplexType: Habilitada por defecto (cuando no se establece el tercer parámetro del constructor). Itera sobre los atributos públicos de un tipo de clase y los registra como subtipos del tipo de objeto complejo.

  • Clase Zend_Soap_Wsdl_Strategy_AnyType: Convierte todos los tipos complejos en el tipo XSD simple xsd:anyType. Tenga cuidado, este atajo para la detección de tipos complejos probablemente solo pueda ser manejado con éxito por lenguajes débilmente tipados como PHP.

  • Clase Zend_Soap_Wsdl_Strategy_ArrayOfTypeSequence: Esta estrategia permite especificar parámetros de retorno del tipo: int[] o string[]. A partir de la versión 1.9 de Zend Framework puede manejar tanto tipos PHP simples como int, string, boolean, float, así como objetos y arrays de objetos.

  • Clase Zend_Soap_Wsdl_Strategy_ArrayOfTypeComplex: Esta estrategia permite detectar arrays de objetos muy complejos. Los tipos de objeto se detectan basándose en Zend_Soap_Wsdl_Strategy_DefaultComplexType y se envuelve un array alrededor de esa definición.

  • Clase Zend_Soap_Wsdl_Strategy_Composite: Esta estrategia puede combinar todas las estrategias conectando tipos complejos PHP (nombres de clase) a la estrategia deseada mediante el método connectTypeToStrategy($type, $strategy). Se puede proporcionar un mapa de tipos completo al constructor como un array con pares $type -> $strategy. El segundo parámetro especifica la estrategia por defecto que se utilizará si se solicita añadir un tipo desconocido. Este parámetro por defecto es la estrategia Zend_Soap_Wsdl_Strategy_DefaultComplexType.

El método addComplexType() crea el elemento '/definitions/types/xsd:schema/xsd:complexType' para cada tipo complejo descrito con el nombre de la clase PHP especificada.

La propiedad de la clase DEBE tener una sección de docblock con el tipo PHP descrito para que la propiedad se incluya en la descripción WSDL.

addComplexType() comprueba si el tipo ya está descrito dentro de la sección de tipos del documento WSDL.

Esto evita duplicaciones si este método se llama dos o más veces, y recursión en la sección de definición de tipos.

Ver http://www.w3.org/TR/wsdl#_types para más detalles.

66.3.11. Método addDocumentation()

El método addDocumentation($input_node, $documentation) añade documentación legible por humanos utilizando el elemento opcional 'wsdl:document'.

El elemento '/definitions/binding/soap:binding' se utiliza para indicar que la vinculación está unida al formato de protocolo SOAP.

Ver http://www.w3.org/TR/wsdl#_documentation para más detalles.

66.3.12. Obtener el documento WSDL finalizado

Los métodos toXML(), toDomDocument() y dump($filename = false) pueden utilizarse para obtener el documento WSDL como XML, estructura DOM o un archivo.



[26] El espacio de nombres 'tns:' se define como el URI del script ('http://' .$_SERVER['HTTP_HOST'] . $_SERVER['SCRIPT_NAME']).

[27] 'http://' .$_SERVER['HTTP_HOST'] . $_SERVER['SCRIPT_NAME']

[28] Por defecto, Zend_Soap_Wsdl se creará con la clase Zend_Soap_Wsdl_Strategy_DefaultComplexType como algoritmo de detección para tipos complejos. El primer parámetro del constructor de AutoDiscover admite cualquier estrategia de tipos complejos que implemente Zend_Soap_Wsdl_Strategy_Interface o una cadena con el nombre de la clase. Por compatibilidad con versiones anteriores, las variables booleanas $extractComplexType se interpretan de la siguiente manera: si es TRUE, Zend_Soap_Wsdl_Strategy_DefaultComplexType, si es FALSE, Zend_Soap_Wsdl_Strategy_AnyType.