前回で説明した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のを利用しています。
メルマガ購読の申し込みはこちらから。