ModelからComponentを呼び出す
cakePHP1.3をつかってて、たまーにモデルからコンポーネントを使いたくなる事があります。
あまり綺麗な方法ではないので多用するのは良くありませんが、同じロジックが重複するようりはマシかなと。
まあコンポーネントでロジックをガッツり書かないで別ライブラリとして作成して、コンポーネントでラッパーさせておけばいいんですが、cakePHPにあるライブラリ(HttpSocketとかSetとか…etc)つかっていると書き直すのもあれだなと。
で、真剣にモデルからコンポーネントを呼ぶ方法を考えてみました。
てかClassRegistry::getObject()でコンポーネントも取得できるんじゃね?
とかおもってコードを追ってみましたが、どうやらaddObjectとかinitとかしている気配がなし。。。
cake/libs/controller/component.phpの中にあるComponentクラスの_loadComponentsメソッドでコンポーネントをインスタンス化しているんですが、ふっつーにnewとか書いてありますね。。。。
まあAppContorllerとかで対象のモデルに渡してデータを渡してあげるってのでもいいのかなと。
// HogeモデルにHogeCoコンポーネントを渡す
$this->Hoge->HogeCo = $this->HogeCo;
でも例えばAppModelで共通の処理を持たせるメソッドでコンポーネントが必要な場合はこの方法にはちと無理がありますね。。
まあ、やってやれない事は無いと思いますが。。。。
まあいろいろと悩みましたが、結局ControllerでloadModelをするようなイメージでgetComoponentとかそんな感じのメソッドを作ればいいんじゃないかとうことで最終的に以下のように実装してみました。
コンポーネント
<?php
class HogeCoComopnent extends Object
{
function __construct() {
$_obj = ClassRegistry::getObject('HogeCo');
if ( $_obj === false ) {
ClassRegistry::addObject('HogeCo', $this);
}
}
...
}
モデル
class AppModel extends Model
{
/**
* ClassRegistryで登録されているコンポーネントを取得する
* @param string $componentName
* @return boolean
*/
function getComponent( $componentName ) {
$_obj = ClassRegistry::getObject( $componentName );
if ( is_object( $_obj ) ) {
$this->$componentName = $_obj;
return true;
}
return false;
}
}
これでモデルからコンポーネントが触れますね。
あまり良くない方法かもしれませんが。。。。w