[s2container-php5:49] 【質問】FileSystemComponentAutoRegisterについて

Yoshinari Ueyama ueyama @ gmail.com
2006年 9月 27日 (水) 17:48:58 JST


植山です。
また質問させてください。今度はS2Container.PHP5についてです。

s2container.php5のexample/dicon/autobinding/配下のファイルを修正して、
FileSystemComponentAutoRegisterを使用するサンプルを作ってみました。
で、下記のようにファイルの検索対象ディレクトリを2つ(test1,test2)設定
したところ、エラーが発生しました。

メッセージ内容から察するに、HashMapImplクラスを2度登録してMap
インターフェースをキーとしてgetComponent()が実行されたためにエラー
となった模様です。

私のdiconファイル記述内容に誤りがありますでしょうか?
FileSystemComponentAutoRegisterを使用する際に何らかの制約事項があるの
でしょうか?

教えてください。よろしくお願いします。

以上です。

---------【以下、参考】------

----[ファイルの構成]----
helloworlderror/
    index.php
    xxxxx.dicon
    components21.dtd
    (略)
    test1/
      Map.class.php
      HashMapImpl.class.php
    test2/
      (ファイルなし)

-------[使用したdiconファイル]---------
<?xml version="1.0" encoding="Shift_JIS"?>
<!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container//EN"
"components21.dtd">
<components>
    <component class="S2Container_FileSystemComponentAutoRegister">
        <property name="instanceMode">"singleton"</property>
        <initMethod name="addClassPattern">
            <arg>"%APP_BASE_PATH%/test1"</arg>
            <arg>".+Impl"</arg>
        </initMethod>
        <initMethod name="addClassPattern">
            <arg>"%APP_BASE_PATH%/test2"</arg>
            <arg>".+Impl"</arg>
        </initMethod>
        <initMethod name="registerAll"/>
    </component>
    <component autoBinding="auto" class="AutoHelloSetterInjection"/>
</components>

-----[実行したコード]-----
(略)
require_once('Hello.class.php');
require_once('test1/Map.class.php');
require_once('test1/HashMapImpl.class.php');
require_once('AutoHelloSetterInjection.class.php');

$PATH = APP_BASE_PATH . "/AutoHelloSetterInjectionError.dicon";

$container = S2ContainerFactory::create($PATH);
$container->init();
$hello = $container->getComponent('Hello');
$hello->showMessage();

----[出力されたエラーメッセージ]----

*Fatal error*: Uncaught exception
'S2Container_TooManyRegistrationRuntimeException' with message 'Two or more
components<HashMapImpl, HashMapImpl> are registered in Map' in
/home/ueyama/lib/s2container.php5/build/s2container.php5/S2Container/S2Container_TooManyRegistrationComponentDefImpl.class.php:64
Stack trace: #0
/home/ueyama/lib/s2container.php5/build/s2container.php5/s2container.core.classes.php(119):
S2Container_TooManyRegistrationComponentDefImpl->getComponent() #1
/home/ueyama/lib/s2container.php5/build/s2container.php5/s2container.core.classes.php(2004):
S2ContainerImpl->getComponent('Map') #2
/home/ueyama/lib/s2container.php5/build/s2container.php5/s2container.core.classes.php(1624):
S2Container_AutoPropertyAssembler->assemble(Object(AutoHelloSetterInjection))
#3
/home/ueyama/lib/s2container.php5/build/s2container.php5/s2container.core.classes.php(1607):
S2Container_SingletonComponentDeployer->_assemble() #4
/home/ueyama/lib/s2container.php5/build/s2container.php5/s2container.core.classes.php(1629):
S2Container_S in *
/home/ueyama/lib/s2container.php5/build/s2container.php5/S2Container/S2Container_TooManyRegistrationComponentDefImpl.class.php
* on line *64

*
-- 
------------------------------------------------------------------
  植山 能成@福岡
mailto:ueyama @ gmail.com
------------------------------------------------------------------
-------------- next part --------------
HTMLの添付ファイルを保管しました...
URL: http://ml.seasar.org/archives/s2container-php5/attachments/20060927/e8798a23/attachment.html 


S2Container-PHP5 メーリングリストの案内