前回で説明したPHPのコーディングスタイルの基準PSR2、これをすべて覚えて手動で実行しようというのは到底無理なこと、そこで登場するのが、php-cs-fixer、自動でそれを行ってくれるツールです。
インストールはいたって簡単。
今回は、phanやphpunitとは違い、プロジェクトが使用しているLaravelやPHPのバージョンに合わせる必要はないので、プロジェクトごとではなくグローバルに、つまり自分のホームディレクトリでのインストールとします。
$ composer global require friendsofphp/php-cs-fixer
これを実行すると、いくつかの必要なパッケージがインストールされます。
そして、~/.composer/vendor/bin/php-cs-fixerにファイル(実際はシムリンク)が作成されます。
どこでもこれが実行できるように、.bahsrcに以下の設定を入れておくことを勧めます。
... export PATH="$PATH:$HOME/.composer/vendor/bin" ...
実行も簡単。例えば、変換対象のファイルを、test.phpとすると、
$ php-cs-fixer fix test.php Loaded config default. Using cache file ".php_cs.cache". 1) test.php Fixed all files in 0.193 seconds, 10.000 MB memory used
test.phpが、デフォルトのルールで、PSR1とPSR2に基づいて変換されます。
以下は、前回の例のファイルを崩したものです。
<?php
namespace Vendor\Package;
use FooInterface;
use BarClass as Bar;
use OtherVendor\OtherPackage\BazClass;
class Foo extends Bar implements FooInterface {
protected $a, $b, $c;
public function sampleMethod( $a,$b = null )
{
if ( $a === $b )
{
bar();
}
elseif ($a > $b)
{
$foo->bar($arg1);
}
else
{
BazClass::bar($arg2,$arg3);
}
}
}
?>
これをphp-cs-fixerで修正すると、前回のように
<?php
namespace Vendor\Package;
use FooInterface;
use BarClass as Bar;
use OtherVendor\OtherPackage\BazClass;
class Foo extends Bar implements FooInterface
{
protected $a;
protected $b;
protected $c;
public function sampleMethod($a, $b = null)
{
if ($a === $b) {
bar();
} elseif ($a > $b) {
$foo->bar($arg1);
} else {
BazClass::bar($arg2, $arg3);
}
}
}
となります。
php-cs-fixerの実行では、.php_cs.cacheのファイルが作成されます。この中には、使用されたJSON設定が収められています。バージョン管理には要らないファイルなので、.gitignoreなどに含むようにしてください。

さて、php-cs-fixerを使用してLaravelのプロジェクト全体をPSR2準拠に変換します。Laravelのプロジェクトにはいろいろなディレクトリがあるために、変換必要なファイルだけを指定する必要があります。そのためには以下のような設定ファイル.php_csが必要です。
<?php
$finder = PhpCsFixer\Finder::create()
->exclude('bootstrap/cache')
->exclude('storage')
->exclude('vendor')
->in(__DIR__)
->name('*.php')
->notName('*.blade.php')
->ignoreDotFiles(true)
->ignoreVCS(true)
;
return PhpCsFixer\Config::create()
->setRules(array(
'@PSR2' => true,
))
->setFinder($finder)
;
設定ファイル自体がphpのプログラムです。そこで見られるように、bootstrap/cache, storage, vendorのディレクトリ以外のphpファイルはすべてPSR2準拠に変換してくれます。しかし、bladeのファイルはphpファイルでないゆえに変換しません。
このファイルを、Laravelプロジェクトのルートディレクトリに置きます、そして変換は、そこで以下の実行だけです。
$ php-cs-fixer fix
変換前に、gitのブランチをこのために作成しておいてから実行してください。例えば、新ブランチをpsr2と命名して、変換後に差分をチェックしたいなら、
$ git diff master -w
と実行すれば、タブからスペースへの変更以外の変更をチェックできます。
最後に、このツールの作者は、有名なphpフレームワーク、symfonyのフレームワークの作者でもあります。Laravelのライブラリの一部はsymfonyのを利用しています。
メルマガ購読の申し込みはこちらから。