LoginSignup
27
29

More than 5 years have passed since last update.

CakePHPで独自に定義した親クラスでのComponentとHelperのマージ

Last updated at Posted at 2013-10-09

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');
}

個人的には後者の方が好みです。

27
29
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
27
29