2014年10月4日土曜日

CakePHP で独自の親クラスを作成する場合の注意点

CakePHP で、全てのコントローラに共通な内容であれば AppController に記述すれば良いけれど、
全てのコントローラに共通する内容で無かったり、ある特定のドメインや機能で共通化を図りたい場合、どう解決するか?
まず思いつくのが AppController と各コントローラの間に独自親コントローラ (以下、DomainController) を作成する方法。
CakePHP でコントローラを作成する場合、AppController を継承して作成するが、
AppController を継承した DomainController を継承してコントローラを作成するようにする。

AppController
全てのコントローラに共通するプロパティやメソッドを定義。

DomainController
ある特定のドメインだけに共通するプロパティやメソッドを定義。

各コントローラ(以下、MyController)
自身に必要なロジックだけを記述。

継承関係が適していればそうしたいけれど、この方法だと DomainController で定義した components, uses といったプロパティが自動マージされず、 DomainController を継承している MyController で参照出来ない。
AppController を直接継承している MyController では、これらプロパティは CakePHP が自動でマージしてくれるて参照出来るのに。。。
DomainController でも共通化ロジックを書くために components, uses といったプロパティを定義する必要があるので、自動マージしてくれないとせっかく共通化したのに MyController で同じ記述しないといけない(全てじゃないにしろ)。。。

何故か?
原因を探ろう。

自動マージされず参照出来ない理由は AppController の親クラス Controller の $_mergeParent にあります。
Controller クラスをソースコード読めば、AppController を直接継承している MyController では自動マージが行われるのかが逆に分かります。
ちなみに Controller::$_mergeParent の値を AppController から DomainController に変えると、今度は AppController で定義している uses などが自動マージされなくなって参照出来なくなる(当たり前)。

ちょっと前置きが長くなったけれど、これを解決する方法は調べると複数あったけれど、
自分は下記のようなアプローチでこの問題を解決するようにした。

class DomainController extends AppController {

    /**
     * コンストラクタ
     * 
     * @see Controller::__construct()
     */
    public function __construct($request = null, $response = null) {

        // uses, components をマージ

        $this->uses = am($this->uses, array(
            'User',
            'Label',
         ));

         $this->components = am($this->components, array(
            'Me.AuthTest',
         ));

    }

    // 以下、共通ロジックなど ...

}
class MyController extends DomainController {

    public $uses = array('Employee');

    public $components = array('Search.Prg');

    public function index() {

        debug($this->uses); // User, Label, Employee + AppController::uses
        debug($this->components); // AuthTest, Search + AppController::components

    }

}


[参考]
CakePHPで独自に定義した親クラスでのComponentとHelperのマージ
http://qiita.com/uda0922/items/e9501c46f5b4cd91106a
$componentsと$helpersと$uses — CakePHP Cookbook 2.x ドキュメント http://book.cakephp.org/2.0/ja/controllers.html#components-helpers-uses

0 コメント :

コメントを投稿