前回で説明したPHPのコーディングスタイルの基準PSR2、これをすべて覚えて手動で実行しようというのは到底無理なこと、そこで登場するのが、php-cs-fixer、自動でそれを行ってくれるツールです。

インストールはいたって簡単。

今回は、phanphpunitとは違い、プロジェクトが使用している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のを利用しています。

By khino