【Laravel】PHP CodeSniffer を使ってコーディングチェクをする

# はじめに

こんにちは、プログラミングを始めて約3年のエンジニアのkeitaMaxです。

今回はPHP CodeSnifferを使ってみようと思います。

https://zenn.dev/yokozawa_0701/articles/4d1816b9e5b2c9

この記事を参考に行っていきます。

# インストール

以下のコマンドで各ライブラリをインストールします。

```
composer require --dev squizlabs/php_codesniffer
composer require slevomat/coding-standard --dev
composer require sirbrillig/phpcs-variable-analysis --dev 
```

# phpcs.xmlの作成

そして、プロジェクトディレクトリ配下に`phpcs.xml`を作成します。

内容は記事で紹介されているものをそのまま使ってみます。

```xml:phpcs.xml
<?xml version="1.0"?>
<ruleset name="PSR12/Laravel">
    <description>PSR12 compliant rules and settings for Laravel</description>

    <arg name="extensions" value="php" />

    <!-- コーディング規約指定 -->
    <rule ref="PSR12">
      <!--<exclude name="Generic.Files.LineLength"/>-->
    </rule>
    <arg name="colors" />
    <arg value="ps" />

    <!-- 除外ディレクトリ設定 -->
    <exclude-pattern>/bootstrap/</exclude-pattern>
    <exclude-pattern>/node_modules/</exclude-pattern>
    <exclude-pattern>/public/</exclude-pattern>
    <exclude-pattern>/resources/</exclude-pattern>
    <exclude-pattern>/storage/</exclude-pattern>
    <exclude-pattern>/vendor/</exclude-pattern>
    <exclude-pattern>/server.php</exclude-pattern>
    <exclude-pattern>/app/Console/Kernel.php</exclude-pattern>
    <exclude-pattern>/tests/CreatesApplication.php</exclude-pattern>

    <rule ref="Generic.Files.LineLength">
        <properties>
            <property name="lineLimit" value="140"/>
            <property name="absoluteLineLimit" value="160"/>
        </properties>
    </rule>

    <rule ref="PSR1.Methods.CamelCapsMethodName.NotCamelCaps">
        <exclude-pattern>*/tests/*</exclude-pattern>
    </rule>

    <rule ref="PSR1.Classes.ClassDeclaration.MissingNamespace">
        <exclude-pattern>./database/migrations/*</exclude-pattern>
    </rule>

    <rule ref="Generic.PHP.Syntax" />
    <rule ref="Generic.Arrays.DisallowLongArraySyntax" />
    <rule ref="Generic.CodeAnalysis.UnconditionalIfStatement" />
    <rule ref="Generic.CodeAnalysis.UselessOverridingMethod" />
    <rule ref="Generic.ControlStructures.DisallowYodaConditions" />
    <rule ref="Generic.Formatting.SpaceAfterCast" />
    <rule ref="Generic.PHP.DeprecatedFunctions" />
    <rule ref="Generic.PHP.ForbiddenFunctions" />
    <rule ref="Generic.VersionControl.GitMergeConflict" />
    <rule ref="Generic.WhiteSpace.ArbitraryParenthesesSpacing" />
    <rule ref="Generic.WhiteSpace.LanguageConstructSpacing" />
    <rule ref="Generic.WhiteSpace.SpreadOperatorSpacingAfter" />
    <rule ref="Squiz.WhiteSpace.FunctionSpacing">
        <properties>
            <property name="spacing" value="1" />
            <property name="spacingBeforeFirst" value="0" />
            <property name="spacingAfterLast" value="0" />
        </properties>
    </rule>
    <rule ref="Squiz.WhiteSpace.SemicolonSpacing" />

    <!-- coding-standard https://github.com/slevomat/coding-standard -->
    <rule ref="SlevomatCodingStandard.PHP.UselessParentheses" />
    <rule ref="SlevomatCodingStandard.PHP.UselessSemicolon" />
    <rule ref="SlevomatCodingStandard.Namespaces.UnusedUses" />
    <rule ref="SlevomatCodingStandard.Whitespaces.DuplicateSpaces">
        <properties>
            <property name="ignoreSpacesBeforeAssignment" value="true"/>
            <property name="ignoreSpacesInParameters" value="true"/>
            <property name="ignoreSpacesInAnnotation" value="true"/>
            <property name="ignoreSpacesInComment" value="true"/>
        </properties>
    </rule>
    <rule ref="SlevomatCodingStandard.Arrays.SingleLineArrayWhitespace" />

    <!-- phpcs-variable-analysis https://github.com/sirbrillig/phpcs-variable-analysis -->
    <rule ref="VariableAnalysis">
        <properties>
            <property name="ignoreUnusedRegexp" value="/^_/"/>
            <property name="allowUnusedParametersBeforeUsed" value="false"/>
        </properties>
    </rule>
</ruleset>
```
除外するディレクトリや、設定などを色々変えられそうです。

# 実行する

参考元と同様に`composer.json`に以下を追加し、以下のようにしました。
```json
    "scripts": {
        "post-autoload-dump": [
            "Illuminate\\Foundation\\ComposerScripts::postAutoloadDump",
            "@php artisan package:discover --ansi"
        ],
        "post-update-cmd": [
            "@php artisan vendor:publish --tag=laravel-assets --ansi --force"
        ],
        "post-root-package-install": [
            "@php -r \"file_exists('.env') || copy('.env.example', '.env');\""
        ],
        "post-create-project-cmd": [
            "@php artisan key:generate --ansi"
        ],
        "phpcs": [
          "./vendor/bin/phpcs --standard=phpcs.xml"
        ]
    },
    
```

インストールと設定ファイルができたので、以下のコマンドで実行してみます。

```
composer phpcs .
```

そうすると、、すごいエラーが出ました。
```
FILE: /app/routes/web.php
-------------------------------------------------------------------------------------------------------------------
FOUND 1 ERROR AFFECTING 1 LINE
-------------------------------------------------------------------------------------------------------------------
 4 | ERROR | [x] Header blocks must be separated by a single blank line (PSR12.Files.FileHeader.SpacingAfterBlock)
-------------------------------------------------------------------------------------------------------------------
PHPCBF CAN FIX THE 1 MARKED SNIFF VIOLATIONS AUTOMATICALLY
-------------------------------------------------------------------------------------------------------------------

Time: 991ms; Memory: 12MB

Script ./vendor/bin/phpcs --standard=phpcs.xml handling the phpcs event returned with error code 2
```

こんな感じでコード規約に沿っていないものが一覧で出てきます。

これに沿って色々修正していきます。


修正すると、以下脳ような感じになります。

```
root@8821023c5696:/app# composer phpcs .
> ./vendor/bin/phpcs --standard=phpcs.xml '.'
.................................................. 50 / 50 (100%)


Time: 998ms; Memory: 12MB

root@8821023c5696:/app# 
```


# おわりに

思ったより簡単にできました。

ただ、半角スペースを入れるのなどの簡単な修正は面倒なので、今後自動でやることができないか調べてみようと思います。

この記事での質問や、間違っている、もっといい方法があるといったご意見などありましたらご指摘していただけると幸いです。

最後まで読んでいただきありがとうございました！


# 参考文献

https://zenn.dev/yokozawa_0701/articles/4d1816b9e5b2c9