メニュー

ドキュメント

はじめに

 はじめにセットアップドキュメントにしたがって S2Container.PHP5-1.2 をインストールして下さい。


コンテナの生成

 S2ContainerApplicationContext クラスの create メソッドを使ってからっぽのコンテナを作ってみます。このサンプルは、s2container.php5/examples/quickstart/quickstart1 にあります。

  quickstart.php

<?php
require_once('S2Container/S2Container.php');
require_once('S2ContainerSplAutoLoad.php');

$container = S2ContainerApplicationContext::create();
$container->getComponentDefSize() == 0 ?
    print 'コンテナはからっぽです。' :
    print 'コンポーネントが入ってます。';
?>

 実行してみます。

% php quickstart.php
コンテナはからっぽです。
%

コンポーネントの生成

 コンテナが生成できたので、コンポーネントをインポートしてみます。このサンプルは s2container.php5/examples/quickstart/quickstart2 にあります。

 カレントディレクトリに classes ディレクトリを作成して、Hello クラスを作ります。

  classes/Hello.class.php

<?php
class Hello {
    public function sayHello() {
        print 'Hello World !' . PHP_EOL;
    }
}
?>

 quickstart.php で classes ディレクトリ以下のクラスファイルが Autoload されるように classes ディレクトリを import します。

  quickstart.php

<?php
require_once('S2Container/S2Container.php');
require_once('S2ContainerSplAutoLoad.php');

S2ContainerApplicationContext::import(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'classes');
$container = S2ContainerApplicationContext::create();
$container->getComponentDefSize() == 0 ?
    print 'コンテナはからっぽです。' :
    print 'コンポーネントが入ってます。';
?>

 実行してみます。

% php quickstart.php
コンポーネントが入ってます。
%

コンポーネントの取得

 「コンポーネントが入ってます。」と表示されたので、取り出してみます。このサンプルは s2container.php5/examples/quickstart/quickstart3 にあります。

  quickstart.php

<?php
require_once('S2Container/S2Container.php');
require_once('S2ContainerSplAutoLoad.php');

S2ContainerApplicationContext::import(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'classes');
$container = S2ContainerApplicationContext::create();
$container->getComponentDefSize() == 0 ?
    print 'コンテナはからっぽです。' :
    print 'コンポーネントが入ってます。';
$hello = $container->getComponent('Hello');
$hello->sayHello();
?>

 実行してみます。

% php quickstart.php
コンポーネントが入ってます。
Hello World !
%

複数のコンポーネントを扱ってみる

 classes ディレクトリに次のような Printer クラスを追加します。このサンプルは s2container.php5/examples/quickstart/quickstart4 にあります。

  classes/Printer.class.php

<?php
class Printer {
    public function printOut($message) {
        print __METHOD__ . ' : ' . $message . PHP_EOL;
    }
?>

 quickstart.php を次のように編集して Printer コンポーネントを取り出してみます。

<?php
require_once('S2Container/S2Container.php');
require_once('S2ContainerSplAutoLoad.php');

S2ContainerApplicationContext::import(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'classes');
$container = S2ContainerApplicationContext::create();
$hello = $container->getComponent('Hello');
$hello->sayHello();
$printer = $container->getComponent('Printer');
$printer->printOut('Hello World !');
?>

 実行してみます。

% php quickstart.php
Hello World !
Printer::printOut : Hello World !
%

DI してみる

 2つのコンポーネントが作成できたので、Hello コンポーネントに Printer コンポーネントを DI ( Dependency Injection) してみます。このサンプルは s2container.php5/examples/quickstart/quickstart5 にあります。
Hello クラスに Printer インスタンスを受け取るセッターメソッドを追加します。また、sayHelloメソッドでPrinter クラスを用いて 出力するように変更します。

  classes/Hello.class.php

<?php
class Hello {
    private $printer;
    public function setPrinter(Printer $printer) {
        $this->printer = $printer;
    }
    public function sayHello() {
        $this->printer->printOut('Hello World ! with DI');
    }
}
?>

 実行してみます。

% php quickstart.php
Printer::printOut : Hello World ! with DI
%

アスペクトしてみる

 S2Container に付属の TraceInterceptor を Printer クラスの printOut メソッドにアスペクトしてみます。このサンプルは s2container.php5/examples/quickstart/quickstart6 にあります。

アスペクト設定は、 @S2Aspect アノテーションで行います。次のように printOut メソッドにアノテーションを記述します。

  classes/Printer.class.php

<?php
class Printer {
    /**
     * @S2Aspect('interceptor' => 'new S2Container_TraceInterceptor');
     */
    public function printOut($message) {
        print __METHOD__ . ' : ' . $message . PHP_EOL;
    }
}
?>

 実行してみます。

% php quickstart.php
BEGIN Printer#printOut(Hello World ! with DI)
Printer::printOut : Hello World ! with DI
END   Printer#printOut(Hello World ! with DI) : null
%

自動アスペクト

 S2ContainerApplicationContext クラスの registerAspect メソッドを用いて自動アスペクトを行います。このサンプルは s2container.php5/examples/quickstart/quickstart7 にあります。

アスペクトしてみるで Printer クラスに記述した @S2Aspect アノテーションは記述しません。

  classes/Printer.class.php

<?php
class Printer {
    public function printOut($message) {
        print __METHOD__ . ' : ' . $message . PHP_EOL;
    }
}
?>

 quickstart.php を次のように編集します。

<?php
require_once('S2Container/S2Container.php');
require_once('S2ContainerSplAutoLoad.php');

S2ContainerApplicationContext::import(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'classes');
S2ContainerApplicationContext::registerAspect('/Printer$/', 'new S2Container_TraceInterceptor', 'printOut');
$container = S2ContainerApplicationContext::create();
$hello = $container->getComponent('Hello');
$hello->sayHello();
?>

 実行してみます。

% php quickstart.php
BEGIN Printer#printOut(Hello World ! with DI)
Printer::printOut : Hello World ! with DI
END   Printer#printOut(Hello World ! with DI) : null
%

DICON ファイルを使用する場合

 これまでの作業をダイコンファイルに記述すると次のようになります。カレントディレクトリに dicon ディレクトリを作成して hello.dicon として保存します。このサンプルは s2container.php5/examples/quickstart/quickstart8 にあります。

  dicon/hello.dicon

<?xml version="1.0" encoding="Shift_JIS"?>
<!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container//EN" "components21.dtd">
<components>
    <component class="Hello">
        <property name="printer">Printer</property>
    </component>
    <component class="Printer">
        <aspect pointcut="printOut">new S2Container_TraceInterceptor</aspect>
    </component>
</components>

 このダイコンファイルを使用するかたちに quickstart.php を編集します。setIncludePattern メソッドでダイコンファイルを Include Pattern に設定します。

<?php
require_once('S2Container/S2Container.php');
require_once('S2ContainerSplAutoLoad.php');

S2ContainerApplicationContext::import(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'classes');
S2ContainerApplicationContext::import(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'dicon');
S2ContainerApplicationContext::setIncludePattern('/hello.dicon$/');
$container = S2ContainerApplicationContext::create();
$hello = $container->getComponent('Hello');
$hello->sayHello();
?>

 実行すると同様の結果が表示されます。

% php quickstart.php
BEGIN Printer#printOut(Hello World ! with DI)
Printer::printOut : Hello World ! with DI
END   Printer#printOut(Hello World ! with DI) : null
%