発行したSQLのクエリをログに出力するコンポーネント

SQL EXPLAIN Componentの反応が良かったので嬉しいです。これからCakePHP 勉強会@福岡の発表ネタを考えます。

SQL EXPLAIN Componentをバージョンアップした際に参考にした下記プラグイン(発行したSQLのクエリをログに出力するコンポーネント)があります。
http://github.com/mcurry/cakephp/tree/master/plugins/sql_log


これを使うと、app/tmp/logs/error.logに下記のような内容が出力されます

2009-03-11 18:49:58 Error: DESCRIBE `posts`
2009-03-11 18:49:58 Error: SELECT COUNT(*) AS `count` FROM `posts` AS `Post`   WHERE `id` IN (1, 2)   
2009-03-11 18:49:58 Error: SELECT * AS `Post` WHERE `id` IN (1, 2)   ORDER BY `test` asc  LIMIT 2

ただし、debug値が2以上の場合のみ出力されます。


このコンポーネントのコードをダウンロードして、app/plugin/sql_log/controllers/components/sql_log.phpに設置し、app_controller.phpで下記の1行を記述するだけで動きます。

var $components = array('SqlLog.SqlLog');


SQL EXPLAIN Componentもコンポーネント内のafterRenderで自動実行させたほうがいいかなと思ったんですが、コンポーネント内にafterRenderとか記述しても呼び出してくれなかったので断念しました。プラグインにすればいけるのかな。
確認した限りでは、コンポーネント内ではbeforeRenderのみ自動で呼ばれるようです。beforeFilter,afterRender,afterFilterは呼んでくれませんでした。

追記:
Shin1x1さんのブログの下記記事を読んだところ、やっぱりコンポーネントではbeforeRenderだけ呼び出されるみたいです。このシーケンス図は何回か見てたんですが、こうやって実装しながら見ると理解が深まりました。素晴らしい記事をありがとうございます。
http://www.1x1.jp/blog/2008/12/cakephp_dispatcher__invoke_sequnce_diagram.html


このプラグインですが、beforeRenderでcake/libs/model/datasources/dbo_source.phpのshowLogメソッドを呼んで、出力されたhtmlを変換してログに出力してます。htmlのテーブルタグで出力された結果を、XMLライブラリを使って配列構造に変換させて処理してます。
showLogメソッドはデバッグ値2以上の時に画面したに発行したSQLがテーブル構造で表示される箇所を出力するメソッドです。

プラグインを複数プロジェクトで共通利用する方法

下記の記事に、複数のcakeアプリから共通のプラグインを利用する方法が書いてあります。
http://mark-story.com/posts/view/making-a-global-plugins-directory-for-cakephp?utm_source=rss

これを使えば、app1とapp2にそれぞれcakeのソースコードがあって管理している時に、それぞれのプラグインディレクト
/home/hoge/app1/app/plugins
/home/hoge/app2/app/plugins
に同じプラグインをコピーして入れなくてすみます。共通して利用するプラグインのソースを一箇所において、各cakeアプリはそのプラグインを参照します(bootstrapに書いて)


今回の方法だと、
/home/hoge/common/plugins/plugin1
/home/hoge/common/plugins/plugin2
プラグインを置いて、各cakeアプリケーションのbootstrap.php

$pluginPaths = array(
     '/home/hoge/common/plugins/',
);

と書けばOK.
デバッグキットのような開発環境のみに利用するプラグインは開発環境のみに読み込むようにすれば便利かと思います(下記参照)。
開発環境と本番環境で設定情報を使い分ける


色々なパスの変更方法
http://book.cakephp.org/ja/view/35/%E5%BF%9C%E7%94%A8%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB