maple: 多段 Injection 例
前回のmaple エントリのコメント欄より。
サンプルを作ってみたのですが、actionクラスに対してlogicをインジェクトすることは出来たのですがlogicに対してdaoをインジェクトすることができませんでした。 logic、daoはwebapp/components/以下に置き、maple.iniは以下のように書きました。
[Action]
userLoginLogic = "ref:userLoginLogic"
userDao = "ref:userDao"
で、これのお返事をセコセコと書いていたら思いのほか長くなってしまったのでいっちょもう少し肉付けした上で1エントリこしらえてしまおうという企みです。
前提であり結論なのですが、ref: で A へ何らかの Component B を Injection する場合、その対象 B は DIContainer に入っている必要があるのです。
components/
┣dao/
┃┗User.class.php
┃
┗logic/
┗UserLogin.class.php
という構成と仮定して、
●dicon.ini
[userDao:dao.user]
[userLoginLogic:logic.userLogin]
userDao = ref:userDao
dicon.ini でまず userDao という名称で Dao をセット。次に Logic に対して userDao という名称で先ほどの Dao をセットします。Logic も Injection したい対象ですからダイコンに入れる訳ですが、その際にダイコンを使って Logic へ Dao を Injection するよ、という流れです。これで userDao をセットした userLoginLogic というものができました。
●maple.ini
[DIContainer]
filename = dicon.ini
[Action]
userLoginLogic = "ref:userLoginLogic"
前回のエントリ例では maple module では logic しか意識してないですから、maple.ini でも logic しか Injection しません。これで Dao -> Logic -> ActionModule という関係が完成です。
上の例では Action Module に対する maple.ini と同列の dicon.ini を読んでいるので Action Module ごとに dicon.ini を準備する必要があります。もし Logic - Dao の組合せが1パターンしかないのであれば、Top に dicon.ini を置いて全 module で参照すれば一つで済みます。実際、各 Module に dicon.ini としてファイルが点在する状況は混乱を招きそうですし。でも変更に対して個別対応できるという強みが。私はケースバイケースでいこうと思ってます。
ちなみに DIContainer に食べさせる方法は dicon.ini 以外にも base.ini への記載、目的の action に付くまでの処理 (session filter や token filter がそうですね) があります。まあ logic, dao を base.ini に入れて太らせたり filter 作成で手間かけたりなんてことは多分しないでしょうね。
(2005-02-23 10:00 追記)
オマケ。
Injection する際、その Injection 先のクラスプロパティ名と設定ファイルでの名称はガチで合わせる必要があります。
上の例での ini ファイルで
[userLoginLogic:logic.userLogin]
userDao = ref:userDao
~~~~~~~
と書いたならば、logic/UserLogin.class.php では
class UserLogin {
var $userDao;
function setUserDao(&$userDao) {
$this->userDao =& $userDao;
}
....
とします。var $userDao; 以外では Injection は全て失敗します。これは、Injection 対象先を UserLogin.class.php の get_class_vars の値をもって決めているからです。より詳細は maple/core/BeanUtils.class.php あたりを参照してください。
トラックバック(0)
このブログ記事を参照しているブログ一覧: maple: 多段 Injection 例
このブログ記事に対するトラックバックURL: http://hatotech.org/mt-admin/mt-tb.cgi/428

大変詳しいご説明ありがとうございます。うまく動かすことが出来ました。
同じdicion.ini内でセットしたオブジェクトもインジェクト出来るんですね。目からうろこです(理解していなかったのは私だけかもしれませんが)。