VS Code で phpcs と phpcbf を利用するときは PHP Sniffer & Beautifier を使うのが最高

PHP のフォーマットは squizlabs/PHP_CodeSniffer を使うのがスタンダードだと思います。 PHP Sniffer & Beautifierプロジェクト固有のルールで phpcs と phpcbf を実行できる 拡張機能です。

インストール

composer で PHP_CodeSniffer をプロジェクトにインストールします。

composer require --dev squizlabs/php_codesniffer

Visual Studio CodePHP Sniffer & Beautifier をインストールします。

marketplace.visualstudio.com

PHP Sniffer & Beautifier のインストールが終わったら Visual Studio Code を再起動します。

使い方

下記操作でフォーマットできます。

  • F1 or cmd + shift + p -> fixer: fix this file
  • alt + shift + f
  • コンテキストメニュードキュメントのフォーマット
  • VS Codeeditor.formatOnSavetrue であればファイルの保存

設定

プロジェクトのルートフォルダに composer.json がある場合はインストールのみで動作します。 また、PHP Sniffer & Beautifier は ruleset.xmlphpcs.xml をプロジェクト内から探し出してルールとして適用してくれます。

僕は普段 CakePHP3 を利用しているので、CakePHP3 が用意している ruleset.xml を利用するには下記の設定を行います。

{
    "phpsab.autoConfigSearch": false,
    "phpsab.standard": "./vendor/cakephp/cakephp-codesniffer/CakePHP/ruleset.xml"
}

各設定値のパスにはワークスペースからの相対パスを指定できるので、 .vscode/settings.json に記述します。 併せて、 .vscode/extensions.jsonvaleryanm.vscode-phpsab を追記してどちらも Git の管理対象とします。

これで、phpcbf もフォーマットルールも同じものをいつでもどこでも利用できるようになるので、最高の可搬性となります。

ver.0.0.4 時点の設定は下記のとおりです。 詳細な情報は README を見てください。

phpsab.allowedAutoRulesets

phpcs のルールセットファイルを配列で指定。

phpsab.autoConfigSearch

ルールセットの自動検索の有効/無効。

ルールセットが見つかった場合は、phpsab.standard の設定値を上書きする。

phpsab.composerJsonPath

composer.json へのパス。

phpsab.debug

PHP Sniffer & Beautifier 実行時のデバック情報の表示/非表示。

phpsab.executablePathCBF

使用する phpcbf へのパス。

phpsab.executablePathCS

使用する phpcs へのパス。

phpsab.fixerEnable

phpcbf による整形の有効/無効。

phpsab.snifferEnable

phpcs による解析の有効/無効。

phpsab.snifferMode

phpcs をいつ実行タイミング。

保存時/タイプ時。

phpsab.snifferShowSources

phpcs の解析結果にどのルールのエラーとなっているかのソースの表示/非表示。

有効にすると cmd + shift + m で開く問題パネルに各エラーにルールがツリー表示される。

phpsab.snifferTypeDelay

phpsab.snifferModeonType のときにタイプから phpcs 実行までの時間。

phpsab.standard

phpcs の --standard オプションに相当する、phpcs 実行時のルール。

未設定か null であれば phpcs の default_standard が使用される。 PSR2 などのビルトインの値や、ルールセットファイルへのパスを指定できる。

PHP Sniffer & Beautifier にたどり着くまで(余談)

最初は phpcbf を試したんですが、phpcbf やルールセットへのパスを相対パス${workspaceFolder} を記述できませんでした。 VS Code の設定の中には window.title のように ${workspaceFolder} など変数が利用できるものがあるのですが、基本的には launch.jsontasks.json でしかサポートしていないようです。 こんなイシュー を見つけたのですが、3年以上対応されてないので期待できない感じですね...

次には保存時にコマンドを実行する拡張機能を利用して保存時に phpcbf を実行してみたんですが、フォーマットされた状態がエディタ上に反映されず続けて保存するとコンフリクトするのですぐ諦めました。

PHP Sniffer & Beautifier はインストール数が少なくて最初は恐る恐るでしたが、README が充実しているのと僕の要件を満たしているので採用に至りました。