PHP のフォーマットは squizlabs/PHP_CodeSniffer を使うのがスタンダードだと思います。 PHP Sniffer & Beautifier は プロジェクト固有のルールで phpcs と phpcbf を実行できる 拡張機能です。
インストール
composer で PHP_CodeSniffer をプロジェクトにインストールします。
composer require --dev squizlabs/php_codesniffer
Visual Studio Code に PHP Sniffer & Beautifier をインストールします。
PHP Sniffer & Beautifier のインストールが終わったら Visual Studio Code を再起動します。
使い方
下記操作でフォーマットできます。
F1
orcmd + shift + p
->fixer: fix this file
alt + shift + f
- コンテキストメニューの
ドキュメントのフォーマット
- VS Code の
editor.formatOnSave
がtrue
であればファイルの保存
設定
プロジェクトのルートフォルダに composer.json
がある場合はインストールのみで動作します。
また、PHP Sniffer & Beautifier は ruleset.xml
や phpcs.xml
をプロジェクト内から探し出してルールとして適用してくれます。
僕は普段 CakePHP3 を利用しているので、CakePHP3 が用意している ruleset.xml
を利用するには下記の設定を行います。
{ "phpsab.autoConfigSearch": false, "phpsab.standard": "./vendor/cakephp/cakephp-codesniffer/CakePHP/ruleset.xml" }
各設定値のパスにはワークスペースからの相対パスを指定できるので、 .vscode/settings.json
に記述します。
併せて、 .vscode/extensions.json
に valeryanm.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.snifferMode
が onType
のときにタイプから phpcs 実行までの時間。
phpsab.standard
phpcs の --standard
オプションに相当する、phpcs 実行時のルール。
未設定か null
であれば phpcs の default_standard が使用される。
PSR2
などのビルトインの値や、ルールセットファイルへのパスを指定できる。
PHP Sniffer & Beautifier にたどり着くまで(余談)
最初は phpcbf を試したんですが、phpcbf やルールセットへのパスを相対パスや ${workspaceFolder}
を記述できませんでした。
VS Code の設定の中には window.title
のように ${workspaceFolder}
など変数が利用できるものがあるのですが、基本的には launch.json
と tasks.json
でしかサポートしていないようです。
こんなイシュー を見つけたのですが、3年以上対応されてないので期待できない感じですね...
次には保存時にコマンドを実行する拡張機能を利用して保存時に phpcbf を実行してみたんですが、フォーマットされた状態がエディタ上に反映されず続けて保存するとコンフリクトするのですぐ諦めました。
PHP Sniffer & Beautifier はインストール数が少なくて最初は恐る恐るでしたが、README が充実しているのと僕の要件を満たしているので採用に至りました。