PHP 8.0 + Laravel 8 + Xdebug 3 + PHPCS + PHPStan on Docker な環境を作ってみた

はじめに

PHP 8.0 をどうしても触りたく、Docker環境を用意したくなりました。
どうせなら何かを作りたいのでLaravelの環境も同時に整えたくなりました。
デバッグも楽に行いたいのでXdebugも標準化したくなりました。
コーディング規約と静的解析を最低限行いたいので、PHP_CodeSnifferとPHPStanも欲しくなりました。
PHP_CodeSnifferは欲張らずにPSR12準拠、PHPStanは欲張ってRun Level Maxでやりたくなりました。

よし、作ろう!ということで作ってみた結果、動くものはできたので公開しようというお話です。

作った結果

ひとまず、動くものはできました。
github.com

ほんの少しだけREADMEにまとめましたが、clone後は、

$ make init
$ make up

を実行して、 http://localhost にアクセスするだけです。

残念ながら、諸事情によりDBは用意していないです。
必要になれば追加しようと思います。

Docker

Docker Composeを使っており、以下の4つのサービスで構成されています。

php

php-fpmがXdebugデバッグモードonで起動します。
基本的にはブラウザで動作確認をするために利用されることを想定しています。

php-cli

php-cliとcomposerが起動します。
基本的には 静的解析やユニットテストなどのコマンドラインでの実行や、PhpStormに設定するインタープリター用サービスとして利用されることを想定しています。
こちらにもXdebugは含んでいるので、明示的にデバッグモードをonにして実行すれば、Xdebubによるデバッグが行えます。

nginx

何の変哲もないnginxです。
php-fpmとの通信は、UnixソケットではなくTCPで行っています。

node

本当に何の変哲もないnodeです。

Laravel 8

基本的に composer create-project laravel/laravel=8.5.9 を実行してできたディレクトリ・ファイル構成をそのまま使っています。
一部、composer.jsonや、後述のPHPCSとPHPStan周りの変更をしています。

Xdebug 3

Xdebugを使ったデバッグを行えるようになっています。
以下の設定がされているので、PhpStorm周りの設定をすればOKです。

[xdebug]
xdebug.client_host=host.docker.internal
xdebug.client_port=9003
xdebug.idekey=PHPSTORM
xdebug.start_with_request=yes

2021.1 EAPも出ている現時点では大丈夫かと思いますが、PhpStorm 2020.3.1よりも前のバージョンだとXdebug3がうまく扱えないようなので、2020.3.1以降のバージョンで使用してください。
https://youtrack.jetbrains.com/issue/WI-56947
PhpStorm 2020.3.1 Release Notes - PhpStorm - Confluence

PHP_CodeSniffer

PSR12に準拠したコーディング規約の検証を行えるようになっています。
以下の設定がされているので、 make qamake cs make cs-fix などで実行できます。

<?xml version="1.0"?>
<ruleset>
    <rule ref="PSR12"/>
    <file>app</file>
    <file>tests</file>
</ruleset>

ただ、デフォルトのLaravelはPSR12の規約チェックに失敗します。
些末なものなので、自動修正と手動修正により通るようにしました。
修正箇所は以下の通りです。
clean: composer cs-fix · ohshige15/docker-laravel@34370bb · GitHub
clean: composer cs 対応 · ohshige15/docker-laravel@afef5fa · GitHub

また、少なくともリポジトリに上がっている状態であれば通らないなどの問題はないのですが、 squizlabs/php_codesniffer: 3.5.8 だと一部PHP8.0の記法に正確に対応していないため、注意が必要です。
ohshige.hatenablog.com

PHPStan

Run Level Maxで静的解析を行えるようになっています。
以下の設定がされているので、 make qamake analyse などで実行できます。

parameters:
    level: max
    paths:
        - app
        - tests

ご覧の通り、 larastan や phpstan-mockery などの extension は含めていません。
必要になれば追加しようと思います。

ただ、extensionやignoreの設定が無い状態では、デフォルトのLaravelはRun Level Maxの静的解析に失敗します。
基本的には以下のような array の型が厳密に定義されていないというエラーがほとんどです。

 ------ -------------------------------------------------------------------------------------------------
  Line   app/Console/Kernel.php
 ------ -------------------------------------------------------------------------------------------------
  15     Property App\Console\Kernel::$commands type has no value type specified in iterable type array.
         💡 See: https://phpstan.org/blog/solving-phpstan-no-value-type-specified-in-iterable-type
 ------ -------------------------------------------------------------------------------------------------

フレームワークの自動生成によるファイルたちが原因なのでignoreしても良い気がしますが、気になるので手動で修正しました。
修正箇所は以下の通りです。
clean: composer analyse 対応 · ohshige15/docker-laravel@aeb9525 · GitHub
正直なところ、こういう修正をしているような例がほとんどなく、これで本当に良いのか自信がありません。
が、間違っていればそれに気づいたときに修正すれば良いだろ精神でいこうと思います。

おわりに

表題で掲げたような構成があまり見つからなかったので、勢い余って作ってみました。
PHPStanがRun Level Maxで通るように修正した箇所が心配です。
また、DBが構成に含められていないのも心残りです。
何か進展があれば続きをやっていこうかなと思います。

参考

Laravel on Docker と言えば
最強のLaravel開発環境をDockerを使って構築する - Qiita