データ構造の扱い

SCA コンポーネントが受け渡しできる PHP のスカラー型は boolean、integer、float および string の四種類です。 それ以外のデータ構造を扱う際には、SCA コンポーネントは Service Data Objects (SDO) を使用します。SDO についての詳細は、このマニュアルの SDO のページ を参照ください。 SDO になじみのあるかたならご存知のとおり、 SDO は (XML のモデルのような) 構造化されたデータを扱うのに非常に適しています。 また、リモートコンポーネントやウェブサービスとのデータのやり取りの際に ごく自然にシリアライズすることができます。 データ構造の受け渡しを行う手段としては、現在 SDO のみをサポートしています。 その他の PHP オブジェクトや配列を受け渡しすることはできません。

SCA ランタイムは、データを常に値渡しします。これはローカルコールでも同じです。 そのため、SCA ランタイムは、パラメータリスト中の SDO のコピーを事前に作成します。これはスカラー型の場合と同じです。

データ構造を SCA コンポーネントで定義する方法

現在、データ構造の定義の場所を指定する手段としては XML スキーマファイルのでの型の指定しかありません。 しかし、将来的には別の方法も可能になるでしょう。 たとえば PHP のクラスやインターフェイスで定義したり、 連想配列で定義したりなどです。

SDO の使用法を説明するために、以下では新しいコンポーネント PortfolioMangement サービスを使用します。 これは、指定した顧客のポートフォリオを表す SDO を返します。

例1 データ構造を使用するコンポーネント

<?php

include "SCA/SCA.php";

/**
 * 顧客のポートフォリオを管理する
 *
 * @service
 * @binding.soap
 *
 * @types http://www.example.org/Portfolio PortfolioTypes.xsd
 *
 */
class PortfolioManagement {

    
/**
     * 指定した顧客のポートフォリオを取得する
     *
     * @param integer $customer_id 顧客 ID
     * @return Portfolio http://www.example.org/Portfolio ポートフォリオ (銘柄と数量)
     */
    
function getPortfolio($customer_id) {
        
// データベースから取得しているものとします
        
$portfolio SCA::createDataObject('http://www.example.org/Portfolio''Portfolio');
        
$holding $portfolio->createDataObject('holding');
        
$holding->ticker 'AAPL';
        
$holding->number 100.5;
        
$holding $portfolio->createDataObject('holding');
        
$holding->ticker 'INTL';
        
$holding->number 100.5;
        
$holding $portfolio->createDataObject('holding');
        
$holding->ticker 'IBM';
        
$holding->number 100.5;
        return 
$portfolio;
    }

}
?>

@types アノテーションは次のようになります。

<?php
@types http://www.example.org/Portfolio PortfolioTypes.xsd
?>

これは、名前空間 http://www.example.org/Portfolio 内の型が、スキーマファイル URI PortfolioTypes.xsd で見つかることを表します。 作成される WSDL では、この情報を次のような import ステートメントで再現します。

<xs:import schemaLocation="PortfolioTypes.xsd"
                      namespace="http://www.example.org/Portfolio"/>

つまり、この URI は、絶対 URI であろうが相対 URI であろうが schemaLocation 属性で指定されたときに解決可能でなければなりません。

SDO の作成

SDO になじみの深い方は、SDO は 認められている構造 (あるいは 'スキーマ' や 'モデル' と呼ばれることもあります) でのみ作成されることをご存知でしょう。 また、'new' を使用するのではなくデータファクトリが必要となることもご存知でしょう。 たいていは、既存のデータオブジェクトをデータファクトリとして使用します。 しかし時には、特に最初のデータオブジェクトを取得するときなど、 何か別のものをデータファクトリとして使用する必要があります。

SCA では、SCA ランタイムクラスかあるいは (ローカルかリモートの) サービスのプロキシを SDO のデータファクトリとして使用できます。 どれを使用するのか、そしていつ使用するのかについて、 次の二つの節で説明します。

SDO の作成について説明するための新しい例を使用します。 サービスに SDO を渡し、そしてそのサービスから SDO を返すものです。

サービスに渡す SDO の作成

サービスをコールする際にデータ構造が必要となる場合、 そのサービスへのプロキシを 対応する SDO 用のデータファクトリとして使用します。 たとえば、ローカルの AddressBook コンポーネントが提供するサービスのプロキシとして使用するコンポーネントを考えて見ましょう。

<?php
/**
 * @reference
 * @binding.local AddressBook.php
 */
$address_book;
?>

コールしようとしている AddressBook コンポーネントの定義は、 次のようになります。

<?php
/**
* @service
* @binding.soap
* @types http://addressbook ../AddressBook/AddressBook.xsd
*/
class AddressBook {

    
/**
     * @param personType $person http://addressbook (person オブジェクト)
     * @return addressType http://addressbook (その person オブジェクトに対応する address オブジェクト)
     */
    
function lookupAddress($person)  {
        ...
    }
}
?>

AddressBook コンポーネントは、 lookupAddress() という名前のサービスメソッドを提供します。 これは、http://addressbook 名前空間の型を使用します。 lookupAddress メソッドは、personType 型のデータを受け取って addressType 型のデータを返します。それぞれの型は、スキーマファイル addressbook.xsd で定義されています。

AddressBook コンポーネントを使用するコンポーネントを作成すると、 インスタンス変数 $address_book にサービスへのプロキシが設定されます。 呼び出し元のコンポーネントは、$address_book に格納されたプロキシを使用して SDO を作成します。実際の例を以下に示します。

<?php
$william_shakespeare        
$address_book->createDataObject('http://addressbook','personType');
$william_shakespeare ->name "William Shakespeare";
$address                    $address_book->lookupAddress($william_shakespeare);
?>

このようにしてプロキシから SDO を作成する方法は、 SCA コンポーネントに限った話ではないことに注意しましょう。 サービスが一般の PHP スクリプトからコールされ、 プロキシを getService() で取得した場合にも同様の方法を使用します。

<?php
$address_book 
SCA::getService('AddressBook.php');
$william_shakespeare $address_book->createDataObject('http://addressbook','personType');
?>

コンポーネントから返す SDO の作成

データオブジェクトを作成して呼び出し元に返す必要のあるコンポーネントは、 データオブジェクトへのプロキシを使用しません。この場合は、 SCA.php の静的メソッド createDataObject() を使用します。 したがって、もし先ほど説明した AddressBook コンポーネントが addressType 型のオブジェクトを名前空間 http://addressbook に作成するのなら、 次のようになります。

<?php
$address 
SCA::createDataObject('http://addressbook','addressType');
?>