一緒に働くプログラマが増えると、まず気づくのは他のプログラマのコードのスタイルが自分とは違うことです。みなそれぞれ独自のスタイルとなる理由付けがあるのですが、ある程度統一されないと他者にとってコードを理解するのに時間がかかるようになります。しかし個人の慣習を変えてもらうのはいつも難しい。そこで登場するのが、以前にも紹介したコードスタイル修正のツール、php-cs-fixer。最近そのLaravel用のルールセットを見つけたので、それを合わせて再紹介です。

インストール

Laravelのプロジェクトのルートのディレクトリにおいて、以下を実行します。

$ composer require friendsofphp/php-cs-fixer --dev

開発環境でしか必要ないので、最後の引数–devは忘れないように。

次に、ルールセットの設定です。先に「Laravel用のルールセットを見つけた」と書きましたが、それは、私がよく使うLaravelアップグレードの有料サービス、Laravel Shiftのクリエイターが作成したものです。以下のgistで取得できます。彼のサービスでもこれが使われています。

https://gist.github.com/laravel-shift/cab527923ed2a109dda047b97d53c200

これをコピペして、.php_csのファイルを作成します。

実行

実行はいたって簡単です。

$ vendor/bin/php-cs-fixer fix
Loaded config default from "/vol1/usr/www/repos/repos/l7x/.php_cs".
Using cache file ".php_cs.cache".
   1) app/Http/Controllers/Auth/RegisterController.php
   2) app/Http/Middleware/CheckForMaintenanceMode.php
   3) routes/web.php

Fixed all files in 0.108 seconds, 14.000 MB memory used

fixの引数は、修正の実行を指示します。そして修正されたファイルが修正後にリストされます。

どんな修正が行われるかの一例として、以下のようなファイルを作成してみました。

namespace App;

use Log;
use Illuminate\Database\Eloquent\Model;
use DB;

class Ugly extends Model
{
	public function test ($x, $y)
	{

if ($x == 1)
{
	//
} else if ($y == 2) { /* */ }

	}
}

思い切って醜いコードにしました。

まず、修正を実行するまえに–dry-runでどの修正ルールが適用されるかをチェックします。

$ vendor/bin/php-cs-fixer fix --dry-run -vv
Loaded config default from "/vol1/usr/www/repos/repos/l7x/.php_cs".
Runtime: PHP 7.2.16
Using cache file ".php_cs.cache".
SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSF
Legend: ?-unknown, I-invalid file syntax (file ignored), S-skipped (cached or empty file), .-no changes, F-fixed, E-error
   1) app/Ugly.php (indentation_type, blank_line_after_opening_tag, elseif, function_declaration, braces, ordered_imports)

Checked all files in 0.050 seconds, 14.000 MB memory used

上で指摘されているのは、修正時に適用するルールセットのことです。説明すると、

  • indentation_type:表示では見えないですが、タブ文字が使われてるところあります。タブを空白文字に変換必要。
  • blank_line_after_opening_tag:namespaceの宣言の前には改行が必要。
  • elseif:else ifでなくelseifを使用に変換必要。
  • function_declaration:関数名と引数名の間のスペースの削除が必要。
  • braces:ブレース(波括弧)の場所がおかしいので修正必要。
  • ordered_imports:インポート(use)の宣言がABC順でないので揃える必要あり。

これらのルールのすべては以下で説明あります。

https://github.com/FriendsOfPHP/PHP-CS-Fixer/blob/2.16/doc/rules/index.rst

たくさんありますね。使用したいルールは、先の.php_csで設定するのですが、たくさんあるゆえに、Laravel Shiftのクリエーターから拝借というわけです。

さて、修正した結果は以下のようになりました。


namespace App;

use DB;
use Illuminate\Database\Eloquent\Model;
use Log;

class Ugly extends Model
{
    public function test($x, $y)
    {
        if ($x == 1) {
            //
        } elseif ($y == 2) { /* */
        }
    }
}

読みやすくなりました。

最後に、拝借した.php_csの設定ですが、私が気に入らない部分がひとつありました。

それは、phpdoc_summaryのルールです。

修正前:

/**
 * これはテスト
 */
class Ugly extends Model
{
...

修正後:

/**
 * これはテスト.
 */
class Ugly extends Model
{
...

ようく見ると、修正後には「これはテスト.」とコメントの最後にピリオドが入ります。つまり句点がないので親切にも追加されます。ちなみに、句点(。)だとピリオドはつきません。

これが余計なお世話と思うなら、.php_csのファイルにおいて、以下のように無効とできます。

...
    'phpdoc_summary' => false,
...

最後に、.php_cs_cacheが実行時に作成されるので、これは.gitignoreに含むことをお忘れずに。

By khino