DOCTYPEはXML宣言の次に指定します。次のように指定してください。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE components PUBLIC "-//SEASAR2.1//DTD S2Container//EN"
"http://www.seasar.org/dtd/components21.dtd">
<components>
<component name="hello" class="Hello"/>
・・・
</components>
ダイコンファイルのルートタグになります。componentsタグにはnamespace属性で名前空間を指定することができます。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE components PUBLIC "-//SEASAR2.1//DTD S2Container//EN"
"http://www.seasar.org/dtd/components21.dtd">
<components namespace="dao">
...
</components>
namespace属性で名前空間を指定することで、コンポーネントの定義を分割した場合に、 複数のコンポーネント定義間で名前が衝突することを避けることができます。 次の例では、parent.diconの中で、foo.diconとbar.diconがincludeされています。 それぞれのダイコンファイルでserviceという同名のコンポーネントが定義されています。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE components PUBLIC "-//SEASAR2.1//DTD S2Container//EN"
"http://www.seasar.org/dtd/components21.dtd">
<components>
<include path="/path/to/foo.dicon"/>
<include path="/path/to/bar.dicon"/>
<component name="service" class="DefaultService"/>
</components>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE components PUBLIC "-//SEASAR2.1//DTD S2Container//EN"
"http://www.seasar.org/dtd/components21.dtd">
<components namespace="foo">
<component name="service" class="FooService"/>
</components>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE components PUBLIC "-//SEASAR2.1//DTD S2Container//EN"
"http://www.seasar.org/dtd/components21.dtd">
<components namespace="bar">
<component name="service" class="BarService"/>
</components>
parent.diconで定義されているserviceコンポーネントは名前空間の指定無しで参照することができます。 foo.diconとbar.diconで定義されているserviceコンポーネントを参照する場合は、名前空間を指定する 必要があります。名前空間の指定は、「.」 ピリオードで行います。foo.diconのserviceコンポーネントを参照する場合は 次のようになります。
<?php
require_once('S2Container/S2Container.php');
$container = seasar\container\factory\S2ContainerFactory::create('/path/to/parent.dicon');
$service = $container->getComponent('service');
$fooService = $container->getComponent('foo.service');
$barService = $container->getComponent('bar.service');
?>
分割されたS2Containerの定義を取り込む場合に使います。 path属性でダイコンファイルのパスを指定します。includeタグはcomponentタグの前に記述する必要があります。 path属性で指定されたダイコンファイルが存在しない場合は、expressionとしてeval関数に渡されます。 そのため、パスに含まれる定数やクラス変数は展開されます。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE components PUBLIC "-//SEASAR2.1//DTD S2Container//EN"
"http://www.seasar.org/dtd/components21.dtd">
<components>
<include path="path/to/foo.dicon" />
<include path="DICON_DIR . '/bar.dicon'" />
</components>
コンポーネントの検索順は、先ず自分自身に登録されているコンポーネントを探します。 見つからない場合は、includeされている順に子供のS2Containerに登録されているコンポーネントを検索し、 最初に見つかったコンポーネントが返されます。
コンポーネントを定義します。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE components PUBLIC "-//SEASAR2.1//DTD S2Container//EN"
"http://www.seasar.org/dtd/components21.dtd">
<components>
<component name="action" class="IndexAction" instance="singleton" autoBinding="auto"/>
</components>
name属性 (任意)
コンポーネントに名前を付けます。デフォルト値はclass属性で指定したクラス名です。class属性 (必須)
コンポーネントのクラス名を指定します。instance属性 (任意)
S2Containerがどのようにコンポーネントのインスタンスを管理するのかを指定することができます。 singleton(デフォルト)、prototypeを指定することができます。詳しくはインスタンスタイプを参照してください。autoBinding属性 (任意)
S2Containerがコンポーネントの依存関係をどのように解決するのかを指定できます。auto(デフォルト)、noneを指定することができます。 詳しくは、バインディングタイプを参照してください。
componentタグの子タグとして使った場合は、コンストラクタの引数になります。記述した順番でコンストラクタに渡されます。 initMethodタグの子タグとして使った場合は、メソッドの引数になります。記述した順番でメソッドに渡されます。 引数値として、ダブルクォートで括った値、componentタグでコンポーネントを指定、ボディに記述したPHPの結果を設定できます。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE components PUBLIC "-//SEASAR2.1//DTD S2Container//EN"
"http://www.seasar.org/dtd/components21.dtd">
<components>
<component class="Hoge">
<arg>"seasar"</arg>
<arg><component class="Foo"/></arg>
<initMethod name="addService">
<arg>new Bar</arg>
</initMethod>
</component>
</components>
componentタグの子タグとして使います。 プロパティ値として、ダブルクォートで括った値、componentタグでコンポーネントを指定、ボディに記述したPHPの結果を設定できます。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE components PUBLIC "-//SEASAR2.1//DTD S2Container//EN"
"http://www.seasar.org/dtd/components21.dtd">
<components>
<component class="Hoge">
<property name="project">"seasar"</property>
</component>
</components>
name属性 (必須)
プロパティ名を指定します。
componentタグの子タグとして使います。引数は、子タグでargタグを使います。name属性を書かずにボディにPHPを記述して、コンポーネントのメソッドを呼び出すこともできます。 initMethodタグが定義されているコンポーネント自身を表す$componentがinitMethodタグ内だけで有効なオブジェクトとして使えます。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE components PUBLIC "-//SEASAR2.1//DTD S2Container//EN"
"http://www.seasar.org/dtd/components21.dtd">
<components>
<component class="HashMap">
<initMethod name="put">
<arg>"aaa"</arg>
<arg>111</arg>
</initMethod>
<initMethod>$component->put("aaa", 111);</initMethod>
<initMethod>print "Hello";</initMethod>
</component>
</components>
name属性 (任意)
メソッド名を指定します。
アスペクトをコンポーネントに組み込みます。aspectタグのボディでInterceptorの名前を指定します。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE components PUBLIC "-//SEASAR2.1//DTD S2Container//EN"
"http://www.seasar.org/dtd/components21.dtd">
<components>
<component name="trace" class="seasar\aop\interceptor\TraceInterceptor"/>
<component class="IndexAction">
<aspect pointcut=".*Action">trace</aspect>
</component>
</components>
pointcut属性 (任意)
pointcut属性にアスペクト対象となるメソッド名を指定することができます。メソッド名には正規表現が使用可能です。 pointcut属性を指定しない場合は、コンポーネントがインターフェースを実装している場合は、すべてのabstractメソッドが対象となります。 コンポーネントがインターフェースを一つも実装していない場合は、そのクラスが実装しているすべてのpublicメソッドが対象となります。 コンポーネントが実装しているインターフェースのすべてのメソッドが対象になります。
componentsタグ、componentタグ、argタグ、propertyタグの子タグとして使います。 メタデータ値として、ダブルクォートで括った値、componentタグでコンポーネントを指定、ボディに記述したPHPの結果を設定できます。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE components PUBLIC "-//SEASAR2.1//DTD S2Container//EN"
"http://www.seasar.org/dtd/components21.dtd">
<components>
<meta name="project">"seasar"</meta>
<component class="Hoge">
<meta name="service">true</meta>
</component>
</components>
name属性 (必須)
メタ名を指定します。
| © Copyright The Seasar Foundation and the others 2005-2010, all rights reserved. |