gallu’s blog

エンジニアでゲーマーで講師で占い師なおいちゃんのブログです。

get_recursive_depth() を実装しました

MWでいうところのModel(「アプリケーションデータ、ビジネスルール、ロジック、関数」ってところから、ウチでは実際の処理一式。他のPHPフレームワーク的には「Controller内にある1Action相当」って思うとわかりやすいかと)に、get_recursive_depth()メソッドを実装しました。


すげぇ大雑把に、MagicWeaponも一応「いわゆるMVC」なので。
・controllerでrequestを受け取って
 →振り分けて
 →担当のModelをアサインして
・Modelで処理して(DBアクセスは、ウチの場合、data_clumpって子と、後は生SQL)
・プログラム制御をcontrollerに戻して
・conrollerからviewに処理がうつって
・viewで出力(するのに、基本、modelとかをある程度参照する)
・(なんかあれば)controllerで〆処理
ってな流れで動きます。


で。
基本的には「controller → model → controller → view → controller」って感じで終わるのですが。
modelの部分が、時々ネストします & modelには「初期処理 / 主処理 / 後処理」ってのがあるので(これは他のPHPフレームワークでも大抵ありますな。大抵、forward、って言われているように認識をしております)。
そうすると


・controller
 ・model1の初期処理
 ・model1の主処理
  ・model2の初期処理
  ・model2の主処理
   ・model3の初期処理
   ・model3の主処理
   ・model3の後処理
  ・model2の後処理
 ・model1の後処理
以下略


なんてのが発生しえます。
基本的には、各modelごとに「必要な初期処理と必要な後処理を書けばいい」のですが。
時々「いずれにしてもmodelでやっていただきたい初期処理 / 後処理」ってのがありまして、かつ、それが更に時々「二回以上走るのは大変にあずましくない」なんてぇ処理がございます。
ちなみにMagicWeaponのmodelですが、大体、こーゆー継承関係を持ってます。


[base_model_skeleton]
 [base_model]
  システム共通のmodel
   front共通のmodel
   admin共通のmodel
    個別の処理を実際に書くmodel


角括弧でくくってるのが、MagicWeaponの直接提供しているクラスですな。
で、上述のような「常にやりたい前処理/後処理」は、システム共通とか、front共通とかadmin共通とか、その辺に書く事が多いです。
それを「一回だけ」にしたい時はどうするか? っていうと…ってのを今回実装したのですが。
例えば、こんなコードをお勧めしようと思っています。

  if (0 == $this->get_recursive_depth()) {
    処理を書く
  }


もうちょいクドく丁寧に書いておくと。
初期処理の場合、こんな感じ。

public function initialize() {
  // 親呼んで
  $r = parent::initialize();
  // 「1回だけ動かしたい」処理
  if (0 == $this->get_recursive_depth()) {
    処理を書く
  }
以下略
}


後処理なら、こう。

public function finalize(){
中略
  // 「1回だけ動かしたい」処理
  if (0 == $this->get_recursive_depth()) {
    処理を書く
  }
  // close系なのでこっちの処理が終わってからcallする
  parent::finalize();
}


これを書くと、上述でいう所の「model1の初期処理」とか「model1の後処理」とか「だけ」で動いて、model2とかmodel3の時には「動かない」ようにすることが出来ます。
勿論、例えばこれが


・controller
 ・model2の初期処理
 ・model2の主処理
 ・model2の後処理


って呼ばれ方をされる時は、ちゃんとmodel2のタイミングで、動きます(forwardで呼ばれてないから)。


本当はマニュアルに書けって話なんですが、マニュアルがちょいと停滞しているので、memoを兼ねて。