Symfonyでdebug環境を最適化しコードを追いやすくする
この記事はSymfony Advent Calender 2015 5日目の記事になります。
- 前(12月4日):Symfonyから手早くYAMLのFixtureを読み込めるAliceFixturesBundle - cloned.log by @clonedさん
- 次(12月6日):Symfonyの本「基本からしっかり学ぶSymfony2入門」を執筆しました @hidenorigoto さん
昨日は@clonedさんの「Symfonyから手早くYAMLのFixtureを読み込めるAliceFixturesBundle」でした。 空いていた12/4を埋めてくださりありがとうございます。私も救世主となるべく投稿することにしました。
実はこの記事が去年のSymfony Advent Calender以来1年ぶりの投稿となってしまいました。 中々アウトプットできてないですね。orz...
さて本題
Symfonyでdebug環境を最適化しコードを追いやすくする
対象環境
Symfony2系(ただしSymfony3系についても少し触れます)
前置き
Symfonyで開発時のデバッグやコードリーディングを行いたい場合、デバッガー立ち上げてコードを追うと、キャッシュファイルが読み込まれてしまって、Symfonyコアのコードが読みづらいということがあると思います。 エラーが発生した場合にも同様で、どのクラスのどの行なのか分かりづらいことがあります。
具体的には、app/bootstrap.php.cache
や classes.php
というファイルのことで、このファイルにはAppKernelやRequestクラス等を始めフレームワークの多くのコアクラスが1ファイルに記述されています。
1ファイルに多数のクラスを詰め込むことで何度もファイルをrequireせずに済みパフォーマンスを向上させているわけですが、開発時のデバッグ&コードリーディングを行いたい場合にはしばしば邪魔になることがあります。
この記事ではその問題をなんとか解決するための方法を書きたいと思います。
設定方法
symfonyのcacheとautoloadの仕組みが分かってしまえばそんなに難しい話ではないのですが、意外と日本語情報もないのでご紹介したいと思います。
紹介したいといいつつ、実は公式ドキュメントに書いてあります。(最近気が付きました)
How to Optimize your Development Environment for Debugging (2.8version)
Symfonyはドキュメントが充実していてどんどん増えているのでよくチェックしておかないとですね。
やることとしては
app/bootstrap.php.cache
を読み込まずに、普通にautoloadを利用する- 生成したcacheファイル(
classes.php
)を読み込まないの2つです。
app_dev.php
を以下のように編集するだけです。
変更前
<?php // ... $loader = require_once __DIR__.'/../app/bootstrap.php.cache'; require_once __DIR__.'/../app/AppKernel.php'; $kernel = new AppKernel('dev', true); $kernel->loadClassCache(); $request = Request::createFromGlobals();
変更後
<?php // ... // $loader = require_once __DIR__.'/../app/bootstrap.php.cache'; $loader = require_once __DIR__.'/../app/autoload.php'; require_once __DIR__.'/../app/AppKernel.php'; $kernel = new AppKernel('dev', true); // $kernel->loadClassCache(); $request = Request::createFromGlobals();
bootstrap.php.cache
の中身ですが、先頭でautoload.php
を読み込んでいて、その後に続けてSymfonyのコアクラスが書かれています。
変更後のコードに書き換えることで、通常のautoloadによってSymfonyのコアクラスがきちんとロードされるようになります。
また、loadClassCache()
コメントアウトすることでclasses.php
を読み込まなくなります。
以上で設定完了です。簡単ですね。
これでコードが読みやすくなりました。Symfonyのコードを読むのはとても参考になるので是非チャレンジしてください。
Symfony3の場合
実はSymfony3の場合も既にドキュメントが書いてありました。 こちらを参考に設定してみてくだい。
How to Optimize your Development Environment for Debugging (current)
補足すると、Symfony3では auloload.php
が bootstrap.php.cache
から分離されました。
【参考】
extract autoloading out from bootstrap by Tobion · Pull Request #854 · symfony/symfony-standard · GitHub
そして bootstrap.php.cache
は /var/
ディレクトリ直下に配置されるようになり、app_dev.phpではデフォルトで読み込まないようになりました。
app.php
ではパフォーマンス向上のためbootstrap.php.cache
利用しています。 https://github.com/symfony/symfony-standard/blob/3.0/web/app.php#L9
まとめ
- ちょっと、書き換えるだけでdebugしやすいようになります。
- Symfonyは(英語の)ドキュメントが充実しているのでよく見ておくといいです。
最期に
まだ「[Symfony Advent Calender 2015](http://qiita.com/advent-calendar/2015/symfony」の枠で空いているところがあります。 この記事のように、日本語化されていないドキュメントのちょっとした紹介や入門記事でも構いません。 是非この機会にSymfonyについて記事を書いてみてください。
明日は @hidenorigoto さんのあの本の話ですね。とても楽しみです。