一緒に働くプログラマが増えると、まず気づくのは他のプログラマのコードのスタイルが自分とは違うことです。みなそれぞれ独自のスタイルとなる理由付けがあるのですが、ある程度統一されないと他者にとってコードを理解するのに時間がかかるようになります。しかし個人の慣習を変えてもらうのはいつも難しい。そこで登場するのが、以前にも紹介したコードスタイル修正のツール、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に含むことをお忘れずに。
メルマガ購読の申し込みはこちらから。