プログラミング - THIS IS IT !

より良い開発をすべく日々奮闘しているプログラマーです。設計やDDDに興味があります。主にPHPネタを書いてます。 Crocos Inc./日本Symfonyユーザー会

Symfonyでdebug環境を最適化しコードを追いやすくする

この記事はSymfony Advent Calender 2015 5日目の記事になります。

f:id:okapon_pon:20151205123050p:plain

昨日は@clonedさんの「Symfonyから手早くYAMLのFixtureを読み込めるAliceFixturesBundle」でした。 空いていた12/4を埋めてくださりありがとうございます。私も救世主となるべく投稿することにしました。

実はこの記事が去年のSymfony Advent Calender以来1年ぶりの投稿となってしまいました。 中々アウトプットできてないですね。orz...

さて本題


Symfonyでdebug環境を最適化しコードを追いやすくする

対象環境

Symfony2系(ただしSymfony3系についても少し触れます)

前置き

Symfonyで開発時のデバッグやコードリーディングを行いたい場合、デバッガー立ち上げてコードを追うと、キャッシュファイルが読み込まれてしまって、Symfonyコアのコードが読みづらいということがあると思います。 エラーが発生した場合にも同様で、どのクラスのどの行なのか分かりづらいことがあります。

具体的には、app/bootstrap.php.cacheclasses.php というファイルのことで、このファイルにはAppKernelやRequestクラス等を始めフレームワークの多くのコアクラスが1ファイルに記述されています。

1ファイルに多数のクラスを詰め込むことで何度もファイルをrequireせずに済みパフォーマンスを向上させているわけですが、開発時のデバッグ&コードリーディングを行いたい場合にはしばしば邪魔になることがあります。

この記事ではその問題をなんとか解決するための方法を書きたいと思います。

設定方法

symfonyのcacheとautoloadの仕組みが分かってしまえばそんなに難しい話ではないのですが、意外と日本語情報もないのでご紹介したいと思います。

紹介したいといいつつ、実は公式ドキュメントに書いてあります。(最近気が付きました)

How to Optimize your Development Environment for Debugging (2.8version)

Symfonyはドキュメントが充実していてどんどん増えているのでよくチェックしておかないとですね。

やることとしては

  1. app/bootstrap.php.cache を読み込まずに、普通にautoloadを利用する
  2. 生成した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.phpbootstrap.php.cache から分離されました。

【参考】 extract autoloading out from bootstrap by Tobion · Pull Request #854 · symfony/symfony-standard · GitHub f:id:okapon_pon:20151205123050p:plain そして 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 さんのあの本の話ですね。とても楽しみです。