動的にコンポーネントを読み込むコンポーネント

CakePHP1.3で動的にコンポーネントを読み込むためのコンポーネント DynamicComponent を作成しました。

cakephp-dynamic-component

注意: Cake本来の機能を超える機能を提供するため、Cakeコアのprivateなメソッドやプロパティにアクセスしています。Cakeのバージョンが上がると使用できなくなる可能性があります。十分ご注意ください。

このコンポーネントを使うと次のようなことが可能になります:

  • admin プレフィクスが付いているときだけ Auth コンポーネントを読み込む
  • debug > 0 のときだけ DebugKit を読み込む

読み込みはコントローラの _initialize メソッドで loadComponents メソッドを使って行います。

class AppController extends Controller
{
  var $components = array('DynamicComponent.Dynamic');
 
  function _initialize() {
    if(!empty($this->params["prefix"]) && $this->params["prefix"] == 'admin') {
      $this->Dynamic->loadComponents('Auth');
    }
    if(Configure::read('debug') > 0) {
      $this->Dynamic->loadComponents('DebugKit.Toolbar');
    }
  }
}

この方法で読み込んだコンポーネントの initialize メソッドからは、さらに別のコンポーネントを読み込むことができます。そのためコントローラから直接 Auth や DebugKit を読み込むよりは、状況に合わせた専用のコンポーネントを用意して、その中で Auth や DebugKit の読み込み・初期化を行うことをお勧めします。以下、Admin と Debug という2つのコンポーネントを作っています。

// app/controllers/components/admin.php
class AdminComponent extends Object
{
  function initialize($controller) {
    $controller->Dynamic->loadComponents('Auth');
 
    //Authコンポーネントのセットアップ
    $controller->Auth->loginAction = array(/*...*/);
  }
}
// app/controllers/components/debug.php
class DebugComponent extends Object
{
  function initialize($controller) {
    $controller->Dynamic->loadComponents('DebugKit.Toolbar');
 
    //その他debugに有用な設定など
    $controller->set(...);
  }
}

また prefix 名に応じた読み込みを行うオプションがあらかじめ用意されているので、コントローラの prefix 判定コードは省略できます。最終的に _initialize メソッドは次のようになります。

class AppController extends Controller
{
  var $components = array('DynamicComponent.Dynamic'
                          => array('prefix' => true));
 
  function _initialize() {
    if(Configure::read('debug') > 0) {
      $this->Dynamic->loadComponents('Debug');
    }
  }
}

One Response

  1. [...] This post was mentioned on Twitter by Takayuki Miwa. Takayuki Miwa said: ブログ更新: 動的にコンポーネントを読み込むコンポーネント http://bit.ly/dyVwVz 個人的にはかなり有用なコンポーネントだと思うのだが、かなり危なっかしいコンポーネントでもある。 [...]

Leave a Reply