明日使える!?CakePHP Hack:SQLデバッグ表示をシンタックスハイライト

明日使える!?CakePHP Hack:SQLデバッグ表示をシンタックスハイライト

イメージ

こんにちは、iPhoneをついに手に入れてテンションが一段落した?tanakaです。本日は、CakePHPで開発するとき、ちょっと気分がよくなるHackをご紹介いたします。

CakePHPを使うときは、セッション1回で実行されたSQL文が一覧できるデバッグレベル2(Configure::write('debug', 2);)で開発することがあると思います。SQL文が一覧できるのは便利ですが、ちょっと味気ないと思いませんか?本日は、そう思った私が、そのSQL文に色を付けるためにやってみた方法をご紹介いたします。cakeのコアの部分も少しだけ変更することになるので、取り扱いには十分ご注意ください。(CakePHP1.2を例に説明いたします)

目次

  • google-code-prettifyを配置
  • APP/app_controller.phpを修正
  • APP/views/layouts/default.ctpを修正
  • CAKE/libs/model/datasources/dbo_source.phpを修正
  • APP/webroot/js/google-code-prettify/prettify.jsを修正
  • まとめ
  • 追記

google-code-prettifyを配置する

シンタックスハイライトを実現する機能は今回google-code-prettifyを使うことにしました。(理由は単に私が使ったことがないというだけです。)これ(prettify-small-21-May-2009.zip)を、ダウンロード・解凍して、 APP/webroot/js/google-code-prettify 以下に展開します。

APP/app_controller.phpを修正

default.ctpでJavascriptヘルパーを使うことになるので、AppControllerで読み込みましょう。以下のように書けばOKです。

<?php
class AppController extends Controller {
  var $helpers = array('Html', 'Javascript');
}
?>

APP/views/layouts/default.ctpを修正

google-code-prettifyのリソースを読み込む為のコードを書きます。"echo $scripts_for_layout;"の上あたりに以下のコードを追加します。

    if (Configure::read() > 0) {
      echo $html->css('/js/google-code-prettify/prettify');
      echo $javascript->link('google-code-prettify/prettify');
      echo $javascript->link('google-code-prettify/lang-sql');
    }

デバッグレベル0のときは読み込まないための分岐で囲みます。他のレイアウトでも使うなら、この部分だけをエレメント化して読み込んでもいいですね。

CAKE/libs/model/datasources/dbo_source.phpを修正

ここでCakePHPのコアのソースコードを修正します。なぜそうするかというと、実行したSQL文リストを出力するコードはすべてdbo_source.phpに埋め込まれてしまっているからです。479行目あたりにforeachでループしながら、SQL文を出力するコードがありますのでそこを修正します。

print ("<tr><td>" . ($k + 1) . "</td><td class=\"prettyprint lang-sql\" style=\"font-family:monaco;\">" . h($i['query']) . "</td><td>{$i['error']}</td><td style = \"text-align: right\">{$i['affected']}</td><td style = \"text-align: right\">{$i['numRows']}</td><td style = \"text-align: right\">{$i['took']}</td></tr>\n");

一行まるごと抜き出したので、わかりにくいかも知れませんが、修正したのは、強調した部分だけです。フォントを指定する部分はお好みで指定しなくても構いません。

APP/webroot/js/google-code-prettify/prettify.jsを修正

もう少し、この修正が最後です。google-code-prettifyは通常pre要素内のコードを処理の対象にしますが、CakePHPが出力するSQL文ダンプはすべて長い一行なので、pre要素で囲むと、本当に長い一行になって大変です。なので、prettify.jsの方を、td要素を処理の対象にするように修正します。prettify.jsの10行目397文字目あたりに

Dd="pre",

と書いてあるので、これを

Dd="td",

と修正します。これで、APP/config/core.phpで、Configure::write('debug', 2);として、SQL文が実行されるような処理を書けば、以下のように表示されると思います。

シンタックスハイライトされたSQL文

いかがでしょうか?色がつくと、ちょっと雰囲気が変わってきますよネ!

まとめ

CakePHPとgoogle-code-prettifyを組み合わせて、SQL文に色を付ける(シンタックスハイライト)方法をご紹介いたしました。

追記 2009/07/07 17:26

cakephperさんがこのエントリのアイデアで、CakePHPのプラグインDebug_kitでSQLシンタックスハイライトするものを作られました。pluginsフォルダに配置して、AppControllerで読み込むだけで使えるのでオススメです!ありがとうございます。

  • このエントリーをはてなブックマークに追加

この記事を読んだ人にオススメ