Laravel で PHP Codesniffer を使用する

Laravel 9 の時点で、優れた Laravel Pint が新しい Laravel インストールにバンドルされています。 私は Pint が大好きで、ほとんどの人にとって、すべてのコード スタイルの書式設定に Pint を使用するだけで十分です。 Laravel Pint を使用する前は、PHP CS Fixer と PHP Codesniffer の組み合わせを好んで使用していました。どちらも併用すると優れており、コード スタイルの適用に役立つ独自のルールを提供します。

行の長さのスタイルは、PHP Codesniffer が PHP CS Fixer などのツールを補完できる例の 1 つであり、開発者が一貫したコード スタイルを維持できるように両方を使用できます。 PSR-12 を使用している場合、Lines セクションには、行の長さに関する次の情報があります。

行の長さに厳しい制限があってはなりません。

行の長さのソフト制限は 120 文字でなければなりません。

行は 80 文字より長くすべきではありません。 それより長い行は、それぞれ 80 文字以下の複数の後続行に分割する必要があります。

私たちの CI ツールは、行の長さのソフト制限とハード制限の両方を適用できますが、PSR-12 を解釈する方法は、PHP Codesniffer がすべきことです。 警告する 行のエラーを返さない > 80 長さで。 これについては、記事の後半で説明します。

新しい Laravel プロジェクトで PHP Codesniffer を設定してみましょう。その後、フォローアップ チュートリアルで、すべてのプロジェクトで共有できるカスタム PHP Codesniffer 標準を作成する方法を学習します。

その過程で、開発中に PHP Codesniffer を最大限に活用するために設定するのが好きな構成設定をいくつか紹介します。

設定

最初にサンプル プロジェクトを作成して、PHP Codesniffer を Laravel にゼロから組み込む方法を確認します。

laravel new phpcs-part-1 --git

cd phpcs-part-1

git フラグは、新しい Laravel アプリケーションをインストールし、git を初期化し、すべてをバージョン管理にコミットします。 これにより、このチュートリアルで行った変更を確認するための白紙の状態が残ります。

次に、PHP Codesniffer を開発依存としてインストールしましょう。

composer require --dev squizlabs/php_codesniffer

注:執筆時点では、必要なコマンドはバージョンをインストールします ^3.7、ただし、バージョンが若干異なる場合がありますが、これは問題ではありません。

あなたが実行する場合 phpcs コマンドラインから、パスを指定する必要があることがわかります。

$ vendor/bin/phpcs

ERROR: You must supply at least one file or directory to process.

 

Run "phpcs --help" for usage information

心配しないでください。PHPCS がどのパスを含める (および除外する) かを指定する構成ファイルを追加しようとしていますが、デフォルトのルールセット (Pear) で実行すると、デフォルトの Laravel インストールで多数のエラーが発生します。 :

$ vendor/bin/phpcs -v app

Registering sniffs in the PEAR standard... DONE (28 sniffs registered)

....

 

FILE: /Users/paul/code/sandbox/phpcs-part-1/app/Providers/AppServiceProvider.php

--------------------------------------------------------------------------------

FOUND 2 ERRORS AFFECTING 2 LINES

--------------------------------------------------------------------------------

2 | ERROR | Missing file doc comment

7 | ERROR | Missing doc comment for class AppServiceProvider

--------------------------------------------------------------------------------

終了コードを調べると、エラーによって PHPCS がゼロ以外のコードで終了することがわかります。

$ echo $?

2

はっきりさせておきたいのですが、これらのエラーは、コードのフォーマットが悪い (まったく逆の) ためではなく、デフォルトの PEAR 標準を使用しているためです。

別の標準を使用して構成ファイルを作成する方法を見てみましょう。

コマンド ライン ツールの探索

プロジェクトに構成ファイルを追加する前に、コマンド ラインを使用して同じ構成がどのように表示されるかを見てみましょう。 PEAR 標準を使用したくないことはわかっているので、最初に組み込みの PSR-12 標準を使用して PHPCS コマンドを実行しましょう。

vendor/bin/phpcs --standard=PSR12 app

出力を注意深く見ると、PHP Codesniffer の PSR12 標準では、連結された文字列の前後のスペースを修正しようとしていることがわかります。

FILE: /Users/paul/code/sandbox/phpcs-part-1/app/Console/Kernel.php

----------------------------------------------------------------------

FOUND 2 ERRORS AFFECTING 1 LINE

----------------------------------------------------------------------

28 | ERROR | [x] Expected at least 1 space before "."; 0 found

28 | ERROR | [x] Expected at least 1 space after "."; 0 found

----------------------------------------------------------------------

PHPCBF CAN FIX THE 2 MARKED SNIFF VIOLATIONS AUTOMATICALLY

----------------------------------------------------------------------

お茶 x これらのスニフを自動的に修正できることを意味します (すべての PHP Codsniffer スニフが自動的に修正できるわけではありません)。 phpcbf Codesniffer に同梱されているビン。 これについてはすぐに説明します。

まず、私が好んで使用するその他のコマンド フラグをいくつか見てみましょう。 開発および CI で PHP Codesniffer を使い始めると、スニフの完全な名前が明らかでないことに気付きます。 そのスニフを微調整したり、特定の行で無視したりすることができます。

コマンド ラインで常に完全なスニフを表示するには、「-s」フラグを使用できます。

vendor/bin/phpcs -s --standard=PSR12 app

完全なスニフで出力がどのように見えるかの例を次に示します。

FILE: /Users/paul/code/sandbox/phpcs-part-1/app/Console/Kernel.php

----------------------------------------------------------------------------------------------------------------

FOUND 2 ERRORS AFFECTING 1 LINE

----------------------------------------------------------------------------------------------------------------

28 | ERROR | [x] Expected at least 1 space before "."; 0 found

| | (PSR12.Operators.OperatorSpacing.NoSpaceBefore)

28 | ERROR | [x] Expected at least 1 space after "."; 0 found

| | (PSR12.Operators.OperatorSpacing.NoSpaceAfter)

----------------------------------------------------------------------------------------------------------------

PHPCBF CAN FIX THE 2 MARKED SNIFF VIOLATIONS AUTOMATICALLY

----------------------------------------------------------------------------------------------------------------

あなたは見ることができます PSR12.Operators.OperatorSpacing.NoSpaceBefore 上記の例で見つかった sniff。 このスニフを無視したい場合 Kernel.php ファイルに、これを追加できます app/Console/Kernel.php 28行目あたりのファイル:

// phpcs:disable PSR12.Operators.OperatorSpacing.NoSpaceAfter

$this->load(__DIR__.'/Commands');

// phpcs:enable

コマンドを再実行すると、今度は Kernel.php ファイル—私たちはそれを見ることができます NoSpaceAfter その行のルールは無効になっていますが、それでも NoSpaceBefore エラー:

vendor/bin/phpcs -s --standard=PSR12 app/Console/Kernel.php

 

FILE: /Users/paul/code/sandbox/phpcs-part-1/app/Console/Kernel.php

----------------------------------------------------------------------------------------------------------------

FOUND 1 ERROR AFFECTING 1 LINE

----------------------------------------------------------------------------------------------------------------

29 | ERROR | [x] Expected at least 1 space before "."; 0 found

| | (PSR12.Operators.OperatorSpacing.NoSpaceBefore)

----------------------------------------------------------------------------------------------------------------

PHPCBF CAN FIX THE 1 MARKED SNIFF VIOLATIONS AUTOMATICALLY

----------------------------------------------------------------------------------------------------------------

次のようにスニフをコンマで区切ることで、特定の行セットに対して複数のルールを無効にすることができます。

// phpcs:disable PSR12.Operators.OperatorSpacing.NoSpaceAfter, PSR12.Operators.OperatorSpacing.NoSpaceBefore

$this->load(__DIR__.'/Commands');

// phpcs:enable

最後に、すべての変更を元に戻しましょう app/Console/Kernel.php 列。 例として使用したこれら 2 つのルールは、Laravel Pint と直接競合することがわかります。Laravel Pint は前後にスペースを必要とします。

まず、上記のスニフを自動的に修正しましょう phpcbf:

vendor/bin/phpcbf --standard=PSR12 app

 

PHPCBF RESULT SUMMARY

----------------------------------------------------------------------------------------------

FILE FIXED REMAINING

----------------------------------------------------------------------------------------------

/Users/paul/code/sandbox/phpcs-part-1/app/Models/User.php 1 0

/Users/paul/code/sandbox/phpcs-part-1/app/Http/Controllers/Controller.php 1 0

/Users/paul/code/sandbox/phpcs-part-1/app/Console/Kernel.php 2 0

----------------------------------------------------------------------------------------------

A TOTAL OF 4 ERRORS WERE FIXED IN 3 FILES

----------------------------------------------------------------------------------------------

それを実行したら、Laravel Pint を実行して、PHP Codesniffer が自動的に修正したのと逆のことを確認しましょう。

$ vendor/bin/pint

FIXED 54 files, 1 style issue fixed

✓ app/Console/Kernel.php concat_space

開発中と CI 環境で両方のツールを使用できるようにするには、スタイルを選択して 1 つのツールで適用し、もう 1 つのツールで無効にする必要があります。 私は Pint からの自動修正を好むので、PHP Codesniffer で競合する Sniff を無効にします。

キューのセットアップ

構成ファイルを作成して、Pint と Codesniffer の間の競合を解決しましょう。 アプリケーションでは、通常、 phpcs.xml ファイルですが、他の人があなたのアプリケーションを出発点として使用できるようにする予定がある場合は、使用を検討できます phpcs.xml.dist. として作成しましょう。 phpcs.xml:

xml version="1.0"?>

<ruleset name= "Laravel PHPCS Rules">

 

<description>PHPCS ruleset for Example app.description>

 

<file>testsfile>

<file>appfile>

 

<arg value= "p"/>

 

<arg value= "s"/>

 

<rule ref="PSR12">

<exclude name="PSR12.Operators.OperatorSpacing.NoSpaceBefore"/>

<exclude name="PSR12.Operators.OperatorSpacing.NoSpaceAfter"/>

rule>

 

<rule ref= "Generic.Files.LineLength">

<properties>

<property name="lineLimit" value="80"/>

<property name="absoluteLineLimit" value="120"/>

properties>

rule>

<rule ref="PSR1.Methods.CamelCapsMethodName.NotCamelCaps">

<exclude-pattern>tests/exclude-pattern>

rule>

 

ruleset>

私が追加したことがわかります -s config への引数であるため、すべてのレポートにスニフ コードが表示されます。 また、 apptest ディレクトリを設定しますが、Codesniffer にチェックさせたいプロジェクト内の他のディレクトリを自由に設定してください。

オペレーターのスペーシング スニフを無効にしたので、Pint は満足し、PHP Codesniffer はこれらのルールを無視します。

また、PSR-12 の言語を行の制限と最大値のガイドとして使用して、行の長さのルールをカスタマイズしました。 これらのスニフは警告として報告されるため、CI でこのツールを実行する場合は、警告が抑制されているか、CI が引き続き警告を通過することを確認する必要があります。 警告は、開発者が開発中に行の長さを修正するのに役立つことを目的としています。

最後に、 NotCamelCaps スニフは除外されます tests PHPUnitテストをスネークケースで書くのが好きなので、フォルダー:

/* @test */

public function it_does_something_awesome()

これで実行できます phpcs 引数なしで、構成ファイルを取得します。 行の長さと複数のインポートに関する行の長さの警告のみが表示されます。

vendor/bin/phpcs

もう 1 つの違反は、 MultipleImport たとえば、次の行が原因です。

class User extends Authenticatable

{

use HasApiTokens, HasFactory, Notifiable;

// ...

}

必要に応じて、このスニフを自由に無効にするか、 phpcbf コマンドラインビン:

vendor/bin/phpcbf

.........F..........F.. 23 / 23 (100%)

 

PHPCBF RESULT SUMMARY

----------------------------------------------------------------------------------------------

FILE FIXED REMAINING

----------------------------------------------------------------------------------------------

/Users/paul/code/sandbox/phpcs-part-1/app/Models/User.php 1 0

/Users/paul/code/sandbox/phpcs-part-1/app/Http/Controllers/Controller.php 1 0

----------------------------------------------------------------------------------------------

A TOTAL OF 2 ERRORS WERE FIXED IN 2 FILES

----------------------------------------------------------------------------------------------

結論

かなりの部分をカバーしましたが、Laravel で PHP Codesniffer をゼロから使い始めることができるはずです。 PHP CS Fixer が実行しない特定のルールの一部をターゲットにしたい場合、これは優れた追加機能となる可能性があります。競合するルールまたは無効にしたいルールを無効にする方法を紹介しました。

Leave a Comment

Your email address will not be published. Required fields are marked *