Введение

Внимание

Это расширение является ЭКСПЕРИМЕНТАЛЬНЫМ. Поведение этого расширения, включая имена его функций и любую другую относящуюся к нему документацию, может измениться в последующих версиях PHP без уведомления. Используйте это расширение на свой страх и риск.

SCA для PHP предназначено для облегчения создания переиспользуемых компонентов, обладающих унифицированным интерфейсом и различными моделями использования. В данный момент компоненты общаться либо локально, либо через веб-сервисы, но в будущем планируется расширить список способов доступа. В целом это расширение создавалось для облегчения жизни разработчика.

Компоненты SCA используют аннотации phpDocumentor (см. Http://www.phpdoc.org/) для инъекции зависимостей от других компонентов SCA или от веб-сервисов. Во время исполнения SCA самостоятельно разрешает эти зависимости, что позволяет разработчику сфокусироваться на бизнес-логике и не заниматься самостоятельным отслеживанием зависимостей.

В будущем SCA может быть дополнена поддержкой REST, Atompub и т.д. Но в настоящее время единственным поддерживаемым методом коммуникаций являются веб-сервисы (точнее, WSDL, SOAP / HTTP-сервисы).

Также компоненты используют аннотации для определения интерфейса предоставляемого ими сервиса. Во время исполнения из этих аннотаций SCA автоматически генерирует WSDL. Для разработчиков знакомых с phpDocumentor работа с аннотациями не доставит каких либо проблем. Развертывание веб-сервиса никогда небыло настолько простым - достаточно просто разместить компонент в корене документов веб-сервера.

Также компоненты используют аннотации для определения структур данных (определенных с помощью сложных типов схемы XML), обрабатываемых с использованием сервисных объектов данных (Service Data Objects или SDO).

PHP-скрипт, который не является компонентом SCA и не содержит аннотаций, может использовать службы компонента SCA. PHP-скрипт или компонент могут выполнять вызовы сторонних веб-сервисов, использующих ту же систему, но использует ту же систему вызовов или аннотаций для получения ссылки.

Для начала мы покажем простой компонент SCA с именем ConvertedStockQuote, который продемонстрирует различные возможности SCA. Он содержит один метод getQuote(), который будет по заданному названию искать котировки и конвертировать их в заданную валюту. Мы будем использовать этот пример в дальнейшем в описании функций для объяснения работы SCA.

Пример #1 Простой компонент SCA

<?php

include "SCA/SCA.php";

/**
 * Вычисляем стоимость указанных акций в заданной валюте.
 *
 * @service
 * @binding.soap
 */
class ConvertedStockQuote {

    
/**
     * Сервис получения курсов конвертации валют.
     *
     * @reference
     * @binding.php ../ExchangeRate/ExchangeRate.php
     */
    
public $exchange_rate;

    
/**
     * Сервис получения котировок.
     *
     * @reference
     * @binding.soap ../StockQuote/StockQuote.wsdl
     */
    
public $stock_quote;

    
/**
     * Получение стоимости акции в заданной валюте.
     *
     * @param string $ticker Название акции.
     * @param string $currency В какой валюте возвращать результат.
     * @return float Стоимость акции в заданной валюте.
     */
    
function getQuote($ticker$currency)
    {
        
$quote  $this->stock_quote->getQuote($ticker);
        
$rate   $this->exchange_rate->getRate($currency);
        return  
$rate $quote;
    }
}
?>

В этом примере показано, что компонент SCA реализован с помощью скрипта, в котором содержится описание класса и в который подключен скрипт SCA.php. Класс содержит смесь бизнес-логики и отсылок к другим компонентам и веб-сервисам. В методе getQuote() содержится только бизнес-логика, но она завязана на переменные класса $stock_quote и $exchange_rate. Тут наличествуют ссылки на два других компонента, которые будут проинициализированы SCA во время исполнения и проксированы на два конкретных сервиса, в независимости от того, где запускается этот компонент. Аннотации этих сервисов показывают, что один из них локальный - он будет запускаться в том же сеансе, что и наш PHP-скрипт, а второй удаленный и будет вызван с помощью SOAP-запроса. Также этот компонент предоставляет метод getQuote() в качестве сервиса, который может быть вызван как локально, так и удаленно.