Obtener un delegado para otro Componente de Servicio

Un componente SCA puede llamar al servicio proporcionado por otro componente SCA. El servicio que proporciona un componente está hecho de todos sus métodos públicos. SCA para PHP actualemnte proporciona dos maneras de que un componente llame a otro: localmente (esto es, dentro del mismo tiempo de ejecución de PHP, y sobre la misma pila de llamadas) o remotamente si el componente llamador expone una vinculación de servicio web.

Para que un componente llame a otro, el llamador necesita un delgado para el componente llamado. Este delegado es proporcionado normalmente por una variable de instancia en el componente llamador, aunque los delegados también se pueden obtener con la llamada a SCA::getService(), como se verá más tarde. Cuando se construye un componente, los delegados son construidos para cualquier variable de instancia que recurra a otro componente, ya que estos delegados están "inyectados" en las variables de instancia. Los delegados se usan siempre, ya sea si el componente es local o remoto, para proporcinar un comportamiento de llamada idéntico entre llamadas remotas y locales (por ejemplo, las llamadas locales se hacen siempre para pasar datos por valor). Los delegados saben cómo localizar el componente requerido y pasar las llamadas realizadas sobre ellos.

Las variables de instancia, que tienen por objeto mantener delgeados para servicio, están indicados por dos anotaciones estilo PHPDocumentor, @reference y @binding. Ambas están ubicadas en la sección de documentación de una variable de instancia de clase, como se muestra en el código de abajo.

La anotación @reference antes de una variable de instancia indica que dicha variable se va a inicializar con un delegado a un componente.

La anotación @binding posee dos formas: @binding.php y @binding.soap, e indica qu el delegado es para un componente local o para un servicio web, respectivamente. Para ambas, @binding.php y @binding.soap, la anotación proporciona una URI objetivo.

Por el momento, con el método basado en anotaciones de especificación de dependencias, la única forma de alterar el objetivo planeado de una referencia es alterar la anotación dentro del componente.

En el ejemplo de ConvertedStockQuote, la variable de instancia $exchange_rate estará inicializada con un delegado para el componente local ExchangeRate siempre que se construya una instancia de ConvertedStockQuote.

Ejemplo #1 Obtener un delegado para unca clase local de PHP

<?php 
   
/**
     * El servicio de tipo de cambio monetario a usar.
     *
     * @reference
     * @binding.php ../ExchangeRate/ExchangeRate.php
     */
    
public $exchange_rate;
?>

Para @binding.php, la URI identifica la ubicación del script que contiene la implementación del componente. El componente será invocado localmente. El servicio proporcionado es el conjunto de métodos públicos del componente. La URI debe ser un nombre de ruta simple, ya sea absoluta o relativa. El componente se cargará con la directiva include de PHP, después de comprobar si ya está cargado con class_exists(). Si la URI es una ruta relativa, se resuelve relativa al componente que contiene la anotación. Observe que esto es diferente del comportamiento normal de PHP, donde los scripts deberían buscar por el include_path de PHP. Esto tiene por objeto proporcionar independencia de ubicaciones para referencias de componentes cruzadas.

Si este servicio ExchangeRate fuera remoto y fuese llamad como un servicio web, solamente cambia la línea @binding. En lugar del proporcionar la ubicación de una clase de PHP, proporciona la ubicación del WSDL que describe el servicio web. En el componente del ejemplo, esto está ilustrado por la segunda referencia:

Ejemplo #2 Obtener un delgado para un servicio web

<?php
/**
     * El servicio de cotización de acciones a usar.
     *
     * @reference
     * @binding.soap ../StockQuote/StockQuote.wsdl
     */
    
public $stock_quote;
?>

El componente StockQuote será invocado mediante una petición de servicio web. En este caso la URI para el WSDL puede ser un nombre de ruta sencillo, o podría contener una envoltura de PHP y comenzar con, por ejemplo, file:// o http://. En el caso que sea un nombre de ruta sencillo, puede ser absoluto o relativo, y si es relativo será resulto relativo al componente que contiene la anotación. Observe que este comportamiento es como el de @binding.php, pero diferente del comportamiento noraml de PHP donde se buscaría el fichero relativo al directorio de trabajo actual de PHP, el cual sería normalmente al ubicación del primer script a ser llamado. Este comportamiento tiene como objeto otorgar consistencia a través de las diferentes vinculaciones y proporcionar algo de independencia de ubicación para referencias entre componentes.