発行した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がテーブル構造で表示される箇所を出力するメソッドです。