Obtention d'un proxy pour un autre composant de service

Un composant SCA peut appeler le service proposé par un autre composant SCA. Le service que fournit un composant est constitué de toutes ses méthodes publiques. SCA pour PHP propose deux méthodes pour que les composants s'appellent les uns les autres : soit localement (i.e., via le même exécutable PHP, et avec la même pile), ou bien à distance, via un service Web.

Afin qu'un composant en appelle un autre, le composant d'appel a besoin d'un proxy jusqu'au composant appelé. Ce proxy est généralement fourni sous forme de variable dans le composant appelant, même si les proxy peuvent être obtenu via la fonction SCA::getService()(). Quand un composant est construit, les proxy sont constitués pour toute variable d'instance qui fait référence à un autre composant, et ces proxy sont injectés dans les variables. Les proxy sont toujours utilisé, que le composant soit distant ou locale, afin de propose une interface d'appel identique, quelque soit la localisation des composants. Les proxy savent comment localiser un composant, et leur passer les appels.

Les variables d'instance qui sont destinées à contenir les proxy sont identifiées par deux annotations PHPDocumentor : @reference et @binding. Ces deux annotations sont rangées dans la section de documentation d'une classe, tel que le montre le code ci-dessous.

L'annotation @reference pour une variable d'instance indique que la variable doit être initialisée avec un proxy de composant.

L'annotation @binding prend deux formes : @binding.php et @binding.soap. Elles indiquent que le proxy est soit local, soit un service Web distant, respectivement. Pour les deux @binding.php et @binding.soap, l'annotation indique l'URI cible.

A ce moment, avec la méthode de spécification des dépendances via les annotations, le seul moyen de modifier la cible d'une référence est de modifier l'annotation dans le composant.

Dans notre exemple, la variable $exchange_rate est initialisée avec un proxy vers le composant ExchangeRate, à chaque fois qu'une instance de ConvertedStockQuote est construite.

Exemple #1 Obtention d'un proxy pour une classe PHP locale

<?php 
   /**
	 * Le service de change à utiliser
	 *
	 * @reference
	 * @binding.php ../ExchangeRate/ExchangeRate.php
	 */
	public $exchange_rate;
?>

Pour @binding.php, l'URI identifie la localisation du script qui contient l'implémentation du composant. Le composant sera appelé localement. Le service fournit est un jeu de méthodes publiques dans le composant. L'URI doit être un simple chemin, absolu ou relatif. Le composant sera chargé avec une fonction include de PHP, après avoir vérifié que le composant n'est pas chargé, avec class_exists(). Si l'URI est relative, elle est résolue relativement au composant qui contient l'annotation. Notez que cela est différent du comportement habituel de PHP, où les scripts cherchent les fichiers dans l'include_path. Ceci est nécessaire pour fournir une indépendance de localisation dans les références.

Si ce service ExchangeRate était distant, et qu'il était appelé comme un service Web, seule la ligne @binding aurait changé. Au lieu de donner la localisation d'une classe PHP, il faudrait donner la localisation d'un fichier WSDL, décrivant un service Web. Dans notre exemple de composant, ceci est illustré par la seconde référence :

Exemple #2 Obtention d'un proxy pour un service Web

<?php
/**
	 * Le service de cotation des actions à utiliser
	 *
	 * @reference
	 * @binding.soap ../StockQuote/StockQuote.wsdl
	 */
	public $stock_quote;
?>

Le composant StockQuote sera appelé comme un service Web. Dans ce cas, l'URI du WSDL peut être un simple chemin, ou utiliser un gestionnaire de flux PHP, et commencer, par exemple, avec file:// ou http://. Dans l'événement où c'est un simple chemin de fichiers, il peut être absolu ou relatif, et dans le cas d'un chemin relatif, il sera résolu relativement au fichier qui contient l'annotation. Notez que c'est le même comportement que pour @binding.php, et que c'est différent du comportement habituel de PHP.

LoadingChargement en cours