CakePHPで独自に定義した親クラスでのComponentとHelperのマージ
環境:
CakePHP2.3系
CakePHPでは、親コントローラ(AppController.php)と各コントローラのComponentとHelperの定義を自動でマージしてくれます。
そのため、AppController.phpでは共通の設定を、各コントローラでは必要なものだけを読み込む事ができます。
ただ、独自で実装したコントローラについてはマージしてくれません。
例えば、AppControllerを継承したAPI用のApiAppController.php、管理画面用のAdminAppController.phpとかです。
解決方法は方法は二つあります。
サンプルとして、下記を用意します。
コントローラ:AppController -> ApiAppController -> SampleController
コンポーネント:Sample1Component,Sample2Component,Sample3Component
1,各親クラスで動的にロード
ApiAppControllerのbeforeFilter()でコンポーネントをロードします。
<?php
App::uses('Controller', 'Controller');
class AppController extends Controller {
public $components = array('Sample1');
}
<?php
App::uses('AppController', 'Controller');
class ApiAppController extends AppController {
public $components = array('Sample2'); // 読み込まれない
public function beforeFilter() {
parent::beforeFilter();
$this->Sample2 = $this->Components->load('Sample2'); // 読み込まれる
}
}
<?php
App::uses('ApiAppController', 'Controller');
class SampleController extends ApiAppController {
public $components = array('Sample3');
}
2,マージする親クラスの変更
これをすると、AppControllerの定義がマージされないので注意してください。
<?php
App::uses('Controller', 'Controller');
class AppController extends Controller {
public $components = array('Sample1'); // 読み込まれない
}
<?php
App::uses('AppController', 'Controller');
class ApiAppController extends AppController {
public $components = array('Sample2'); // 読み込まれる
// マージする親クラスを変更
protected $_mergeParent = 'ApiAppController';
}
<?php
App::uses('ApiAppController', 'Controller');
class SampleController extends ApiAppController {
public $components = array('Sample3');
}
個人的には後者の方が好みです。