iPhone/iPadのホーム画面コンテスト開催中!賞品は iTunes カード!

CakePHP & PHP 2009/05/28 12:07

CakePHP フレームワークのソースをapp/で置き換える

こないだのCakePHP勉強会でやったネタですが、需要がありそうなんで書きます。

CakePHPは1.2Finalになって色々と改良が成されて拡張性も増えたのですが、良くなってきた分、さらに色々とやりたくなるのが人の常です。そこでフレームワークのソースをどうしても書き換えたい時にcake/を触るのではなく、せめてapp/でフレームワークソースを置き換えましょう、という話です。

[目標] ConnectionManagerをapp/に置く

デモではDispatcherの置き換えをやったのですが、cake bake diaryさんのエントリのように需要があるかもなので、ConnectionManagerをapp/に置いてフレームワークに読ませようと思います。

1. ConnectionManagerのソースをapp/以下にコピー

ConnectionManagerを一から書いても良いのですが、それも大変なので、まずフレームワークのConnectionManagerのソースをapp/以下にコピーします。

ConnectionManagerはcake/libs/model/connection_manager.phpになるので、それに倣ってapp/modles/connection_manager.phpにコピーします。

$  cp -a cake/libs/model/connection_manager.php app/models/

2. ConnectionManagerのソースを変更する

app/にコピーしたConnectionManagerを変更します。ここでは読み込まれたソースが分かりやすいように先頭にファイルパスをvar_dump()しておきます。

[app/models/connection_manager.php]

PHP:
  1. <?php
  2. var_dump(__FILE__); // <---追加
  3. /* SVN FILE: $Id: connection_manager.php 8120 2009-03-19 20:25:10Z gwoo $ */
  4. /**
  5. * Datasource connection manager
  6. *
  7. * Provides an interface for loading and enumerating connections defined in app/config/database.php
  8. *
  9. * PHP versions 4 and 5

3. ConnectionManagerをフレームワークに読ませる

最後にapp/のConnectionManagerをフレームワークに読み込ませます。これにはApp::import()のキャッシュ機能を使います。

方法は簡単で、bootstrap.phpに以下のように書くだけでokです。

[app/config/bootstrap.php]

PHP:
  1. App::import('Core', 'ConnectionManager', array('file' => '../app/models/connection_manager.php'));

ブラウザからアクセスすると下のように画面上に2.で書いたパスが表示されて、[app/models/connection_manager.php]が読み込まれているのが分かります。

あとはこのソースをガシガシ書き換えていけばokです。

いざという時使えるかも

少しトリッキーな方法ですが、フレームワークのソースを書き換える手段としては覚えておいて損は無いと思います。

ただし、この方法はApp::import()の機能を利用しているので、フレームワークがApp::import()で読まないソース(Objectとか)は残念ながら使えません。あしからず。



■Related Posts

One Response to “CakePHP フレームワークのソースをapp/で置き換える”

  1. on 28 5月 2009 at 14:21 1.ラボブログ said …

    CakePHP + Ktai Library 非公式 Wik...

    スパイスラボ神部です。 先日、第4回CakePHP勉強会@Tokyo に参加してきました。 特に聞きたかった K-tai Library のセッションも聞くこと... (more...)

Trackback This Post | Subscribe to the comments through RSS Feed

Leave a Reply