はじめに
はじめにセットアップドキュメントにしたがって 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 %